2015-09-19 73 views
3

誰能解釋這段代碼的輸出是如何:如何創建臨時對象以及發生的實際操作是什麼?

deleting 0xbfc69f7c 3,7 
deleting 0xbfc69f84 2,4 
deleting 0xbfc69f8c 1,3 

爲什麼不臨時對象的析構函數獲取調用它從重載+運算符返回過程中產生的。 Fraction對象是在+函數內部創建的,它的臨時副本是相同的,析構函數只被調用一次,我想這不應該是這種情況。任何人都可以解釋發生在這裏的實際操作。

在此先感謝!

class Fraction{ 

    int num ; 
    int den ; 
    public: 
    Fraction(int x = 0 , int y = 0 ){ num = x ; den = y ; } 
    Fraction(const Fraction & f){ 

     cout<<"Copy Constructor for "<<f.num<<" , "<<f.den<<endl ; 
     num = f.num ; 
     den = f.den ; 

    } 
    Fraction operator+(const Fraction& f) const{ 

     int x = f.num + num ; 
     int y = f.den + den ; 

     return Fraction(x,y) ; 

    } 

    ~Fraction(){ 

     cout<<"deleting "<<this<<" "<<num<<","<<den<<endl ; 

    } 

}; 

int main() { 

    Fraction f1(1,3); 
    Fraction f2(2, 4); 
    Fraction f3 = f1 + f2 ; 

    return 0; 
} 

回答

0

此行不會創建一個新的Fraction,然後將其複製到f3

Fraction f3 = f1 + f2 ;

它初始化f3f1內容,然後+運營商是用來添加f2 。沒有臨時對象被創建和刪除。例如。使用Fraction複製構造函數代替賦值運算符。臨時對象將被創建和賦值運算符在這種情況下使用:

Fraction f3; 
f3 = f1 + f2; 

正如其他人所指出的那樣,編譯器將優化使用拷貝構造函數,避免(的Elid)的副本即使您以調試模式構建,也可以使用f1f3

+1

不,複製構造函數用於初始化'f3'對象,但是它是[* elided *](https://en.wikipedia.org/wiki/Copy_elision)。 –

+0

@JoachimPileborg你是對的,當然,我打亂了。現在就修好了 –

+0

請你解釋一下,你的意思是什麼? –

4

這是因爲return value optimizationcopy elision(感謝約阿希姆)。臨時對象將被刪除。

+0

不要忘記[複製elision](https://en.wikipedia.org/wiki/Copy_elision)。 –

+0

謝謝@Xiaotian pei –

相關問題