|
发表于 2014-4-4 08:40:51
|
显示全部楼层
#include <iostream>
#include <string>
template <class T>//类模板
class Stack
{
public:
Stack()
{
m_Size = 0;
m_sp = 0;
m_flag = 1;
m_data = NULL;
}
Stack(unsigned int size)
{
std::cout << "进入主构造器\n";
this->m_Size = size;
m_data = new T[size];
m_sp = 0;
m_flag = 1;
std::cout << "离开主构造器\n";
}
Stack( const Stack &rhs)
{
std::cout << "进入副本构造器\n";
m_Size = 0;
m_sp = 0;
m_flag = 1;
m_data = NULL;
*this = rhs; //该=已经被重载
std::cout << "离开副本构造器\n";
}
~Stack()
{
std::cout << "进入析构造器\n";
delete []m_data;
std::cout << "离开析构造器\n";
}
Stack & operator = (const Stack &rhs)
{
std::cout << "进入赋值语句重载\n";
if(this != &rhs)
{
std::cout << "是否删除的标志位值为: "<< m_flag << std::endl;
if(m_flag && m_data)
{
std::cout << "执行删除\n";
delete [] m_data;
m_data = NULL;
}
//赋值语句
m_Size = rhs.m_Size;
m_sp = rhs.m_sp;
m_data = new T[m_Size];
memcpy_s(m_data, m_Size * sizeof(T), rhs.m_data, m_sp * sizeof(T));
//*data = *rhs.data; //两个指针,指向不同的地址,但里面的内容值是一样的
}
else
{
std::cout << "赋值号两边为同个对象,不做处理!\n";
}
std::cout <<"离开赋值语句重载\n";
return *this;
}
void push(T value)
{
m_data[m_sp++] = value;
}
T pop()
{
return m_data[--m_sp];
}
private:
unsigned int m_Size;
unsigned int m_sp;
int m_flag ; //是否在重载=操作符时删除原来的ptr
T* m_data;
};
int main()
{
Stack<int> intStack(100);
intStack.push(1);
intStack.push(2);
intStack.push(3);
Stack<int> intStack1 = intStack;
std::cout << intStack.pop() << std::endl;
std::cout << intStack.pop() << std::endl;
std::cout << intStack.pop() << std::endl;
intStack1.push(4);
intStack1.push(5);
intStack1.push(6);
std::cout << intStack1.pop() << std::endl;
std::cout << intStack1.pop() << std::endl;
std::cout << intStack1.pop() << std::endl;
return 0;
} |
|