临时变量与复制构造函数(二)

来源:互联网 发布:mac book pro速度慢 编辑:程序博客网 时间:2024/06/05 22:35

为了直观观察,以下代码中复制构造函数会把成员变量num+1

class B{int num;public:B():num(0){cout << "默认构造函数" << "  num= "<< num <<endl;}B(int n) :num(n){cout << "带参构造函数" << "  num= " << num << endl;}B(const B &b){num = b.num+1;cout << "复制构造函数" << "  num= " << num << endl;}/*B(B &&b){cout << "移动构造函数" << endl;}*/B& operator=(const B &b){cout << "赋值操作符" << "  num= " <<b. num << endl;if (this == &b)return *this;num = b.num;return *this;}~B(){cout << "析构函数" << "  num= " << num << endl;}};B play(B b){B bb(79);return bb;}void main(){{B b1(1);B b2 = play(b1);}cout << "-------------------------" << endl;{B b1;B b2(10);b2 = play(b1);}}


输出:


以上结果可以看出,一个函数调用结束后,首先析构函数代码产生的局部变量,然后析构输入参数产生的临时变量,最后析构返回值产生的临时变量。



把上面代码中的play函数进行修改,进行对比:

B play(B b){B bb(79);return b;}void main(){{B b1;B b2 = play(b1);}cout << "-------------------------" << endl;{B b1;B b2(10);b2 = play(b1);}}

输出:

默认构造函数  num= 0    //b1
复制构造函数  num= 1    //复制b1给play的参数b
带参构造函数  num= 79   //局部变量bb
复制构造函数  num= 2    /play的参数b通过复制构造函数,产生临时变量,作为返回值,该返回值直接“命名为”b2(这是编译器的优化?)
析构函数  num= 79       //局部变量bb析构
析构函数  num= 1        //play的参数b析构
析构函数  num= 2        //b2析构
析构函数  num= 0        //b1析构
-------------------------
默认构造函数  num= 0    //b1
带参构造函数  num= 10   //b2
复制构造函数  num= 1    //复制b1给play的参数b
带参构造函数  num= 79   //局部变量bb
复制构造函数  num= 2    //play的参数b通过复制构造函数,产生临时变量,作为返回值
析构函数  num= 79       //局部变量bb析构
析构函数  num= 1        //play的参数b析构
赋值操作符  num= 2      //b2通过赋值操作符重新赋值
析构函数  num= 2        //play的返回值析构
析构函数  num= 2        //b2析构
析构函数  num= 0        //b1析构





0 0