Как создаются временные объекты и какие фактические операции происходят?

Может ли кто-нибудь объяснить, как выглядит вывод этого кода:

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

person Sunny Shah    schedule 19.09.2015    source источник


Ответы (2)


Это связано с оптимизацией возвращаемого значения и копировать elision (спасибо Иоахиму). Временный объект будет ликвидирован.

person Xiaotian Pei    schedule 19.09.2015

Эта строка не создает новый Fraction, а затем копирует его в f3:

Fraction f3 = f1 + f2 ;

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

Fraction f3;
f3 = f1 + f2;

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

person Manos Nikolaidis    schedule 19.09.2015