2015-09-19 10 views
3

Может кто-нибудь объяснить, как выход из этого кода:Как создаются временные объекты и каковы фактические операции, которые происходят?

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

Почему не временные объекты деструктор вызывался, который был создан во время возвращения из перегруженного оператора +. Является ли объект фракции, созданный внутри функции +, и его временная копия одинакова, а деструктор вызывается только один раз, я думаю, это не должно быть так. Может ли кто-нибудь объяснить, какие операции происходят здесь.

Заранее благодарен!

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 ;

Он инициализирует f3 с содержимым f1, а затем оператор + используется для добавления f2 , Временный объект не создается и не удаляется. Например. Конструктор копии из Fraction используется вместо оператора назначения . Временный объект будет создан и оператор назначение используется в данном случае:

Fraction f3; 
f3 = f1 + f2; 

Как уже отмечалось, компилятор будет оптимизировать использование конструктора копии и избежать (Elide) копия f1 - f3, даже если вы построите режим отладки.

+1

Нет, экземпляр-экземпляр используется для инициализации объекта 'f3', однако он [* elided *] (https://en.wikipedia.org/wiki/Copy_elision). –

+0

@JoachimPileborg, вы правы, конечно, я набрал небрежно. исправлено сейчас –

+0

Пожалуйста, объясните, что вы имеете в виду под его руководством? –

4

Это из-за return value optimization и copy elision (спасибо Joachim). Временный объект будет удален.

+0

Не забудьте [копировать] (https://en.wikipedia.org/wiki/Copy_elision). –

+0

Спасибо @Xiaotian pei –