2015-11-06 61 views
0

希望我的線程能找到你。C++中構造函數的調用不等於C++中析構函數的調用次數

我試過的東西,我需要一個解釋

我做了對複數類,印刷在構造函數中執行,並在析構函數執行單詞「析構函數」單詞「構造」。

我已經宣佈3個對象,把他們按值是非類成員函數從類作爲參數有兩個對象,並返回一個類對象作爲兩個複數

的總和我我們發現,析構函數調用的數量不等於構造函數調用的數量,實際上它們更多。

我有2個構造函數調用和4個析構函數調用。

有沒有人對這件事有任何解釋?

非常感謝您的合作和幫助。

+1

還定義了複製構造函數並打印其調用。也許你會用這種方法來平衡建築和破壞的數量。 – 101010

+0

您是在所有構造函數(默認構造函數,複製構造函數和移動構造函數)中打印日誌還是僅打印其中的一個? – Paul

+0

我已經實現了默認的構造函數和一個帶有2個參數的構造函數,我只使用了兩個參數,並將打印指令放在兩個參數中。 – user2268349

回答

0

有許多構造函數,其中一些可能會爲你創建:

默認的構造MyClass()做盡可能小的工作,建立了MyClass的對象。

複製構造MyClass(const MyClass & source)source成MyClass的

一個全新的對象

移動構造MyClass(MyClass && source)源的內容移動到MyClass的一個全新的對象,並留下source空,但處於安全狀態。

很多時候你會發現複製構造函數在後檯安靜地使用,而你沒有聲明或要求它。例如,

myVector.push_back(myObject); 

通常會將myObject複製到myVector中。

void MyFunction(MyClass myObject) 

按值接受myObject,並可以複製進程中的源對象。要看到這個行動:

void MyFunction(MyClass myObject) // copy constructs myObject from the caller's parameter 
{ 
    myVector.push_back(myObject); // copy constructs a myClass into myVector from myObject 
} // destructs myObject 

在這個調用中,創建了兩個新對象,一個被銷燬。如果你還沒有定義一個帶有打印行的拷貝構造函數以顯示它發生了,你只會看到一個神祕的析構函數調用。當vector被銷燬,清除或myObject被移除時,會有另一個析構函數調用。

MyClass MyOtherFunction() 

如果需要複製返回的MyClass,但通常會找到解決方法。

這不是一個解決方案,但可能是一個解決方案的路徑:添加一個打印語句的複製構造函數。

MyClass(const MyClass & source) 
{ 
    // copy all member variables from source to this 
    std::cout << "Copy constructor called" << std::endl; 
} 

而且我建議您閱讀Rule of Three以瞭解爲什麼這很重要。提示:與過度實現西斯無關。