簡體   English   中英

如何創建臨時對象以及實際執行的操作是什么?

[英]How are temporary objects created and what's the actual operations that takes place?

任何人都可以解釋這段代碼的輸出是:

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;
}

這是因為返回值優化復制省略 (感謝Joachim)。 臨時對象將被刪除。

此行不會創建新的Fraction ,然后將其復制到f3

Fraction f3 = f1 + f2 ;

它用f1的內容初始化f3 ,然后+運算符用於添加f2 沒有創建和刪除臨時對象。 例如,使用Fraction復制構造函數而不是賦值運算符 在這種情況下,將創建一個臨時對象並使用賦值運算符

Fraction f3;
f3 = f1 + f2;

正如其他人所指出的那樣,編譯器將優化復制構造函數的使用,並避免(刪除) f1f3的副本(即使你在調試模式下構建)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM