希望我的線程能找到你。C++中構造函數的調用不等於C++中析構函數的調用次數
我試過的東西,我需要一個解釋
我做了對複數類,印刷在構造函數中執行,並在析構函數執行單詞「析構函數」單詞「構造」。
我已經宣佈3個對象,把他們按值是非類成員函數從類作爲參數有兩個對象,並返回一個類對象作爲兩個複數
的總和我我們發現,析構函數調用的數量不等於構造函數調用的數量,實際上它們更多。
我有2個構造函數調用和4個析構函數調用。
有沒有人對這件事有任何解釋?
非常感謝您的合作和幫助。
希望我的線程能找到你。C++中構造函數的調用不等於C++中析構函數的調用次數
我試過的東西,我需要一個解釋
我做了對複數類,印刷在構造函數中執行,並在析構函數執行單詞「析構函數」單詞「構造」。
我已經宣佈3個對象,把他們按值是非類成員函數從類作爲參數有兩個對象,並返回一個類對象作爲兩個複數
的總和我我們發現,析構函數調用的數量不等於構造函數調用的數量,實際上它們更多。
我有2個構造函數調用和4個析構函數調用。
有沒有人對這件事有任何解釋?
非常感謝您的合作和幫助。
有許多構造函數,其中一些可能會爲你創建:
默認的構造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以瞭解爲什麼這很重要。提示:與過度實現西斯無關。
還定義了複製構造函數並打印其調用。也許你會用這種方法來平衡建築和破壞的數量。 – 101010
您是在所有構造函數(默認構造函數,複製構造函數和移動構造函數)中打印日誌還是僅打印其中的一個? – Paul
我已經實現了默認的構造函數和一個帶有2個參數的構造函數,我只使用了兩個參數,並將打印指令放在兩個參數中。 – user2268349