1.相关数据结构成员方法的调用
class Stack
{
public:
Stack()
{
cout << this << endl;
cout << "Stack()" << endl;
mpstack = new int[10];
mtop = -1;
msize = 10;
}
//explicit:你明确的调用了这个构造函数,我才给你构造对象;否则
//编译错误 explicit:防止隐式产生临时对象用的!
//explicit Stack(int size)
Stack(int size)
{
cout << this << endl;
cout << "Stack(int)" << endl;
mpstack = new int[size];
mtop = -1;
msize = size;
}
Stack(int size, int len, int initVal)
{
cout << this << endl;
cout << "Stack(int, int, int)" << endl;
mpstack = new int[size];
msize = size;
mtop = -1;
for (int i = 0; i < len; ++i)
{
mpstack[++mtop] = initVal;
}
}
~Stack()
{
cout << this << endl;
cout << "~Stack()" << endl;
delete[]mpstack;
mpstack = NULL;
}
Stack(const Stack &src)
{
cout << &src << "=>" <<this << endl;
cout << "Stack(const Stack &src)" << endl;
mpstack = new int[src.msize];
msize = src.msize;
mtop = src.mtop;
for (int i = 0; i <= mtop; ++i)
{
mpstack[i] = src.mpstack[i];
}
}
void operator=(const Stack &src)
{
cout << &src << "=>" << this << endl;
cout << "void operator=(const Stack &src)" << endl;
if (this == &src)
return;
delete[]mpstack;
mpstack = new int[src.msize];
msize = src.msize;
mtop = src.mtop;
for (int i = 0; i <= mtop; ++i)
{
mpstack[i] = src.mpstack[i];
}
}
private:
int *mpstack;
int mtop;
int msize;
};
class Test
{
public:
Test(int a = 5, int b = 5) :ma(a), mb(b)
{
cout << "Test(int, int)" << endl;
}
~Test()
{
cout << "~Test()" << endl;
}
Test(const Test &src) :ma(src.ma), mb(src.mb)
{
cout << "Test(const Test&)" << endl;
}
void operator=(const Test &src)
{
ma = src.ma; mb = src.mb; cout << "operator=" << endl;
}
private:
int ma;
int mb;
};
Test t1(10, 10);//程序运行时开辟,调用带有两个整型参的构造函数
int main()
{
Test t2(20, 20);//调用带有两个整型参的构造函数
Test t3 = t2;//调用自定义的拷贝构造函数
static Test t4 = Test(30, 30);//t4起初开辟内存,在运行时调用拷贝构造函数
t2 = Test(40, 40);
//1.调用带有两个整型参(20,20)的构造函数构造临时对象 2.赋值运算符的重载函数 3.析构临时对象
t2 = (Test)(50, 50);//相当于强转逗号表达式,相当于t2=Test(50,5)[5是默认大小]
//1.调用带有两个整型参(20,20)的构造函数构造临时对象 2.赋值运算符的重载函数 3.析构临时对象
t2 = 60;//相当于隐式产生一个临时对象,等价于t2=Stack(60,5)
//1.调用带有两个整型参(20,20)的构造函数构造临时对象 2.赋值运算符的重载函数 3.析构临时对象
Test *p1 = new Test(70, 70);//动态开辟对象的内存,调用带有两个整型参的构造函数
Test *p2 = new Test[2];//动态开辟对象的内存,调用带有两个默认的构造函数
//堆上动态开辟的内存必须手动delete,否则永远不会析构
Test *p3 = &Test(80, 80);
//指针:1.调用带有两个整型参的构造函数构造一个临时对象 2.语句结束临时对象析构
Test &p4 = Test(90, 90);
//引用:调用带有两个整型参的构造函数构造一个临时对象,并给这个临时对象起了个别名p4,所以语句结束临时对象不会析构
delete p1;//手动释放p1所占用的外部资源
delete[]p2;//手动释放p2所占用的外部资源
}
Test t5(100, 100);//程序运行时开辟,调用带有两个整型参的构造函数
//释放的顺序是:p4,t3,t2,t4,t5,t1
class Test
{
public:
Test(int a = 5) :ma(a)
{
cout << "Test(int=5)" << endl;
}
~Test()
{
cout << "~Test()" << endl;
}
Test(const Test &src) :ma(src.ma)
{
cout << "Test(const Test&)" << endl;
}
void operator=(const Test &src)
{
ma = src.ma;
cout << "operator=" << endl;
}
int getValue(){ return ma; }
private:
int ma;
};