示例1
#include <iostream>
using namespace std;
class A
{
public:
A(){
cout<<this<<" constructor"<<endl;
}
A(const A &other)
{
cout<<this<<" cp contructor from "<<&other<<endl;
}
~A()
{
cout<<this<<" destructor"<<endl;
}
};
A foo(A& a)
{
return a;
}
int main()
{
A a;
foo(a);
cout<<1233<<endl;
return 0;
}
在main的栈上事先开辟了一个临时空间,把这个空间的地址隐式的转到foo函数栈上。然后,把 a 内的东西,拷贝到临时空间中。 所以发生一次构造,一次拷贝, 两次析构。临时空间在“foo(a);”语句结束后就掉用析构器。所以在1233输出前析构提示。
示例2
#include <iostream>
using namespace std;
class A
{
public:
A(){
cout<<this<<" constructor"<<endl;
}
A(const A &other)
{
cout<<this<<" cp contructor from "<<&other<<endl;
}
~A()
{
cout<<this<<" destructor"<<endl;
}
};
A foo(A& a)
{
return a;
}
int main()
{
A a;
A t=foo(a);
cout<<1233<<endl;
return 0;
}
此时 main 函数中产生的临时空间,由 t 来取而代之。所以也发生一次构造,一次拷贝,两次析构。但是 t 的析构是在main结束后,所以析构提示在1233后。
示例3
#include <iostream>
using namespace std;
class A
{
public:
A(){
cout<<this<<" constructor"<<endl;
}
A(const A &other)
{
cout<<this<<" cp contructor from "<<&other<<endl;
}
A & operator=(const A &other)
{
cout<<this<<" operator = "<<&other<<endl;
}
~A()
{
cout<<this<<" destructor"<<endl;
}
};
A foo(A& a)
{
return a;
}
int main()
{
A a;
A t;
t=foo(a);
cout<<1233<<endl;
return 0;
}
此时 main 栈上通过拷贝构造产生了中间变量,中间变量向 t 发生了赋值。