2011-05-21 123 views
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()中,似乎該參數未被複制。這是否意味着:如果將返回值傳遞給參數,參數將不會被複制?

回答

2
AT func(AT at) 
{ 
    return at; 
} 

可能是一些編譯器優化。

At不會被創建,只會在事後銷燬。 取而代之的是,func的參數用於直接創建func2的參數,就好像你已經調用了func2(at);

+0

我在VS2010中編譯,關閉了optmization。 – demaxSH 2011-05-21 02:18:04

+0

http://msdn.microsoft.com/en-us/library/a8kfxa78(v=vs.80).aspx「因爲返回值不會複製到另一個對象,所以會創建一個臨時對象。」所以在func2(func(at))中沒有創建臨時的。 – 2011-05-21 02:27:37

+0

好的,我明白了。如果將返回值分配給某個對象,則不會創建臨時對象。如果沒有賦值,則創建一個臨時對象。 – demaxSH 2011-05-21 02:35:00