为了直观观察,以下代码中复制构造函数会把成员变量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); } }
输出:
屏幕输出中,横线之前的内容,play返回值不产生临时变量,但横线之后却产生临时变量,为什么??
原文地址:http://blog.csdn.net/bupt8846/article/details/45218215