三种构造函数:
1.无参构造函数
2.有残构造函数
3.copy构造函数
析构函数
构造函数的调用方式:
1.隐式(自动调用)
2.显式(手动调用)
3.copy构造函数的几种调用时机
匿名对象的去和留
#include <iostream>
using namespace std;
class Test{
private:
int a;
int b;
public:
Test(){//无参构造函数
a = 3;
b = 5;
cout << "我是构造函数,被执行了" << endl;
}
Test(int _a, int _b){//带参数的构造函数
a = _a;
b = _b;
cout << "我是带参数构造函数,被执行了" << endl;
}
Test(const Test &obj){//赋值构造函数(copy构造函数)
a = obj.a;
b = obj.b;
cout << "我是拷贝构造函数,被执行了" << endl;
}
~Test(){//析构函数
cout << "我是析构函数,被调用了" << endl;
}
void print(){
cout << "a: " << a << " b: " << b << endl;
}
};
/* 实验1 */
void stage1()//搭建一个舞台,将展示构造函数和析构函数调用的时机
{
cout << "experiment 1" << endl;
Test t0;//自动调用(隐式)
Test t1(1, 2);//手动调用(显式)
Test t2 = t1;//用另一个对象去初始化这个对象,会调用copy构造函数
Test t3;
t3 = t1;//直接将一个对象赋值给另一个对象,不调用如何构造函数
//当它们的生命周期结束,编译器会对每个对象调用析构函数
}
/* 实验2 */
void f(Test p){
p.print();
}
void stage2()//搭建舞台2,将展示当对象做函数参数时的运行机制机制(copy构造函数的调用时机)
{
cout << "experiment 2" << endl;
Test b;
//1.展示f()函数
f(b);//b实参去初始化形参p,这是会调用copy构造函数,将b拷贝给形参p
//当局部变量p的生命周期完成时,调用p的析构函数
}
/* 实验3 */
//结论:函数的返回值是一个元素(复杂类型的),返回的是一个新的匿名对象,所以会调用匿名对象类的copy构造函数
//然后g函数中的A对象会被析构
Test g()
{
Test A(1, 2);
return A;
}
void stage3()
{
Test B;
B = g();//用匿名对象,赋值给B对象(扶正),然后匿名对象析构,匿名对象赋给B后,立马被析构掉
//再比如
Test B1 = g();//用匿名对象初始化B1,此时c++编译器直接将匿名对象转成B1(扶正)
}
int main()
{
stage1();
stage2();
stage3();
return 0;
}
实验1:
实验2: