2016-07-28 31 views
0

看看這個代碼:當使用複製構造函數保存它的變量被賦予一個新變量時,以前的對象是否被銷燬?

#include <iostream> 
using namespace std; 

class A { 
    private: 
     int _x; 
     int _id; 
     static int count; 
    public: 
     A(int x) : _x(x) { 
      this->_id = A::count++; 
      cout << "Object with id "  << this->_id 
       << " has been created." << endl; 
     } 
     ~A() { 
      cout << "Object with id "  << this->_id 
       << " has been destroyed." << endl; 
     } 

     int get_x(void) { 
      return this->_x; 
     } 

     A add(A& object) { 
      A tmp(this->_x + object._x); 
      return tmp; 
     } 
}; 

int A::count = 1; 

int main(void) { 
    A object_1(13); 
    A object_2(5); 
    A object_3(12); 

    object_3 = object_1.add(object_2); 

    cout << object_3.get_x() << endl; 


    return 0; 
} 

下面是該程序的輸出:

Object with id 1 has been created. 
Object with id 2 has been created. 
Object with id 3 has been created. 
Object with id 4 has been created. 
Object with id 4 has been destroyed. 
18 
Object with id 4 has been destroyed. 
Object with id 2 has been destroyed. 
Object with id 1 has been destroyed. 

我不明白髮生了什麼ID爲3到​​對象?它絕對是被創造出來的,但是我沒有看到線條告訴我它曾經被毀壞過。你能告訴我這裏發生了什麼事嗎?

順便問題,那爲什麼當我使用return 0,析構函數正常工作,但是當我使用exit(EXIT_SUCCESS)我沒有看到Object with # has been destroyed印在屏幕上,儘管析構函數永遠不會被調用。

+1

您的輸出不完整,因爲您沒有跟蹤複製構造函數。看看add函數和它返回的結果。 – PaulMcKenzie

+0

'exit()'不調用析構函數。根據定義。如果你想調用析構函數,你從main返回。這就是語言的工作原理。 –

+0

@MikhailR。請參閱[無優化](http://rextester.com/SLKNSX2722)。現在看到[優化啓用](http://rextester.com/EXTKL92760)。注意不同的輸出,一個調用複製構造函數,另一個不調用。 – PaulMcKenzie

回答

5

當使用複製構造函數保存它的變量被賦予一個新變量時,前一個對象是否被銷燬?

這個問題是沒有意義的,因爲這是不可能的。

當您運行

object_a = object_b; 

這個調用賦值運算符(而不是拷貝構造函數)。它不會創建或銷燬任何對象(除非您的賦值操作符那樣做)。

在這種情況下,您尚未定義賦值運算符,因此使用默認值,它會用另一個對象的ID(它是4)覆蓋object_3的ID。所以當object_3被銷燬時,它會打印出「ID爲4的對象已被銷燬」。

+0

好吧,所有這些都是非常有意義的,但是不是默認的複製構造函數的工作將所有東西從對象#4複製到對象#3?我認爲當你在對象中使用賦值操作符時,默認的拷貝構造函數會啓動並執行復制過程? –

+0

@MikhailR。 - 複製構造函數可以被編譯器刪除。就目前的C++標準而言,你無法預測複製構造函數何時或多少次被調用。 – PaulMcKenzie

+1

@MikhailR。複製構造函數複製所有東西,賦值運算符也複製所有東西,但它們不一樣。 – immibis

相關問題