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