2015-05-30 2 views
0

Я побежал следующий кодКакова логика этих деструктор вызывает

#include <iostream> 
using namespace std; 

class Count 
{ 
    private: 

     int count;  

    public: 

     //Constructor 
     Count():count(0) { cout << "Constructor called" << endl; } 

     //Destructor 
     ~Count() { cout << "Destructor called" << endl; } 

     //Display the value. 
     Count display() 
     { 
       cout << "The value of count is " << count << endl; 
       return *this; 
     } 

}; 

int main() 
{ 
    Count C; 
    C.display(); 
} 

Результат: -

Constructor called 
The value of count is 0 
Destructor called 
Destructor called 

В приведенном выше случае, деструктор вызывается дважды, один для разрушения " этот "объект и один для возврата из основного.

Является ли мое наблюдение правильным?

Может ли кто-нибудь объяснить мне также временный объект, созданный в этом процессе, например, почему он создан, если создан?

+0

Помог ли вам любой ответ? –

ответ

1

Деструктор называется дважды, потому что функция display возвращает копию экземпляра , на который он вызывается. Так что он уничтожается вместе с вашим C экземпляром в пределах main.

2 экземпляра = 2 вызова деструктора.

Если вы указали и внедрили свою функцию, чтобы вернуть экземпляр из Count, он сделает это. Если вы не хотите этого поведения, измените тип возврата на void и ничего не вернете - тогда ваш код будет содержать только один экземпляр C.

3

Вы возвращаете копию из метода display(), поэтому ее необходимо уничтожить. Итак, у вас на самом деле есть 2 объекта, один - неявно.

0

Ваш код здесь

Count display() { 
// ^^^^^ 
      cout << "The value of count is " << count << endl; 
      return *this; // <<<<<< 
    } 

создает скрытую копию экземпляра, который возвращается и немедленно уничтожены, следовательно, второй деструктора вызов.

0

Да, правильно.

Ваша функция display() создала копию, которая сделала второй объект.

если вы вернете reference, вы не получили бы копию.

Count& display() { return *this; } 
+0

Просто пояснение, копия происходит от «этого указателя» до графа, справа. И во время этой копии мы вызываем конструктор копии по умолчанию ?? – Sathish

+0

@Sathish Да, если вы создадите конструктор копирования с помощью std :: cout, вы должны увидеть его создание. –

Смежные вопросы