为了直观观察,以下代码中复制构造函数会把成员变量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