2
我在why my local object destroyed twice?之前发布了一个类似的问题,但我对其他问题感到困惑。返回值作为函数参数
这里的程序:
class AT
{
public:
int a;
AT() { cout<<"construct"<<endl; }
AT(const AT& at) { cout<<"copy"<<endl; }
~AT() { cout<<"destroy"<<endl; }
};
AT func(AT at)
{
return at;
}
AT func2(AT at)
{
at.a = 5;
return at;
}
然后我打电话:
AT at;
func2(func(at));
输出为:
construct
copy
copy
destroy
copy
destroy
destroy
我想会有4复制和4破坏输出,我很清楚func(at),参数被复制,并且返回值被复制,并且两者都在以后被销毁。但在func2()中,似乎该参数未被复制。这是否意味着:如果将返回值传递给参数,参数将不会被复制?
我在VS2010中编译,关闭了optmization。 – demaxSH 2011-05-21 02:18:04
http://msdn.microsoft.com/en-us/library/a8kfxa78(v=vs.80).aspx“因为返回值不会复制到另一个对象,所以会创建一个临时对象。”所以在func2(func(at))中没有创建临时的。 – 2011-05-21 02:27:37
好的,我明白了。如果将返回值分配给某个对象,则不会创建临时对象。如果没有赋值,则创建一个临时对象。 – demaxSH 2011-05-21 02:35:00