为什么会要会想要谈谈这个话题呢,因为最近在看书的时候发现一本书上的一个例程有关于用函数返回值赋值一个对象时,注释说先清除临时对象,再清除函数内作返回值的局部对象。考虑了下,有些怀疑。于是写了几个程序想验证,结果注释掉了复制构造函数的声明作对比。然而,结果却让自己困惑了很久,特别是程序6。最后就作了下面的讨论。当然,也证明了书上说的是错误的。
这段测试程序代码如下,打开和关闭注释可得6个程序:
#include<iostream>
using namespace std;
using namespace std;
int count;
class test
{
private:
int x,y;
public:
test(){ count=count+1;cout<<"count="<<count<<" "<<"initializing..."<<&x<<endl;};
test(int a,int b):x(a),y(b){ count=count+1; cout<<"count="<<count<<" "<<"initializing..."<<&x<<endl;}
test(const test &);
void Show();
~test(){ count=count-1; cout<<"count="<<count<<" "<<"delete"<<x<<","<<y<<&x<<endl;}
};
{
private:
int x,y;
public:
test(){ count=count+1;cout<<"count="<<count<<" "<<"initializing..."<<&x<<endl;};
test(int a,int b):x(a),y(b){ count=count+1; cout<<"count="<<count<<" "<<"initializing..."<<&x<<endl;}
test(const test &);
void Show();
~test(){ count=count-1; cout<<"count="<<count<<" "<<"delete"<<x<<","<<y<<&x<<endl;}
};
test::test(const test &t)
{
x=t.x;
y=t.y;
count=count+1; cout<<"count="<<count<<" "<<"copying..."<<&x<<endl;
}
{
x=t.x;
y=t.y;
count=count+1; cout<<"count="<<count<<" "<<"copying..."<<&x<<endl;
}
void test::Show()
{
cout<<"this is "<<x<<","<<y<<endl;
}
{
cout<<"this is "<<x<<","<<y<<endl;
}
test func()
{
cout<<"entering func"<<endl;
test A(1,1);
A.Show();
return A;
}
{
cout<<"entering func"<<endl;
test A(1,1);
A.Show();
return A;
}
void display(test a)
{
cout<<"entering display"<<endl;
test A(2,2);
A.Show();
}
int main()
{
//打开复制构造函数注释则是程序1,注释掉复制构造数声明及定义是程序4
test C;
C=func();
/*
//打开复制构造函数注释则是程序2,注释掉复制构造数声明及定义是程序5
test C=func();
*/
/*
//打开复制构造函数注释则是程序3,注释掉复制构造数声明及定义是程序6
display(func());
*/
cout<<"out display"<<endl;
return 0;
}
{
cout<<"entering display"<<endl;
test A(2,2);
A.Show();
}
int main()
{
//打开复制构造函数注释则是程序1,注释掉复制构造数声明及定义是程序4
test C;
C=func();
/*
//打开复制构造函数注释则是程序2,注释掉复制构造数声明及定义是程序5
test C=func();
*/
/*
//打开复制构造函数注释则是程序3,注释掉复制构造数声明及定义是程序6
display(func());
*/
cout<<"out display"<<endl;
return 0;
}