[英]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;
}
此行不會創建新的Fraction
,然后將其復制到f3
:
Fraction f3 = f1 + f2 ;
它用f1
的內容初始化f3
,然后+
運算符用於添加f2
。 沒有創建和刪除臨時對象。 例如,使用Fraction
的復制構造函數而不是賦值運算符 。 在這種情況下,將創建一個臨時對象並使用賦值運算符 :
Fraction f3;
f3 = f1 + f2;
正如其他人所指出的那樣,編譯器將優化復制構造函數的使用,並避免(刪除) f1
到f3
的副本(即使你在調試模式下構建)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.