代码如下:
#include <iostream>
using namespace std;
class Test
{
int mValue;
public:
Test(int i)
{
mValue = i;
cout << "Test(int i) i = " << i << endl;
}
Test(const Test& obj)
{
mValue = obj.mValue;
cout << "Test(const Test& obj) " << endl;
}
~Test()
{
cout << "~Test() mValue = "<< mValue << endl;
}
int Value()
{
return mValue;
}
};
Test func(int i)
{
Test ret(i);
return ret;
}
int main()
{
Test t = func(3);
cout << t.Value() << endl;
Test t1(1);
t1 = func(5);
cout << t1.Value() << endl;
return 0;
}
VC++运行结果如下:
Test(int i) i = 3
Test(const Test& obj)
~Test() mValue = 3
3
Test(int i) i = 1
Test(int i) i = 5
Test(const Test& obj)
~Test() mValue = 5
~Test() mValue = 5
5
~Test() mValue = 5
~Test() mValue = 3
根据运行结果,我们可以知道这样的运行顺序:
1)进入func()函数创建一个Test对象ret,初始值为3,然后返回这个对象。
2)使用拷贝构造函数初始化t对象,然后析构返ret对象。
3)打印t对象中的value
4)创建新对象t1,初始值设为1
5)进入func()函数创建一个Test对象ret,初始值为5,然后返回这个对象。
6)使用拷贝构造函数初始化一个新的t1对象,析构之前创建的t1对象,析构返回值对象。
7)打印t1对象中的value
8)析构创建的对象
下面把相同的源码放到gcc下编译运行,结果如下:
Test(int i) i = 3
3
Test(int i) i = 1
Test(int i) i = 5
~Test() mValue = 5
5
~Test() mValue = 5
~Test() mValue = 3
我们可以发现gcc对创建对象的过程进行了优化,取消了不必要的拷贝构造和析构。