簡體   English   中英

C ++:默認的復制構造函數是否受到其他構造函數和析構函數的影響?

[英]C++: Is default copy constructor affected by presence of other constructors and destructor?

我們知道 ,如果聲明了任何構造函數(包含復制構造函數),則不會隱式創建默認構造函數(不帶參數的構造函數)。 使用默認復制構造函數(執行對象的淺層復制的構造函數)會發生同樣的情況嗎? 此外,析構函數的存在是否會對此產生影響?

12.8#4 復制類對象

如果類定義沒有顯式聲明復制構造函數,則會隱式聲明一個

析構函數不起作用

這里的答案是正確的但不完整。 它們適用於C ++ 98和C ++ 03。 在C ++ 11中,如果已聲明移動構造函數或移動賦值運算符,則不會獲得復制構造函數。 此外,如果已聲明了復制賦值運算符或析構函數,則不建議隱式生成復制構造函數。 12.8 [class.copy]:

如果類定義沒有顯式聲明復制構造函數,則沒有用戶聲明的移動構造函數,並且沒有用戶聲明的移動賦值運算符,復制構造函數被隱式聲明為默認值(8.4.2)。 如果類具有用戶聲明的副本賦值運算符或用戶聲明的析構函數,則不推薦使用此類隱式聲明。

不會。除非您提供自己的復制構造函數,否則您將獲得默認的復制構造函數,並且析構函數的存在與否都沒有區別。

不,請注意

MyClass
{
    template <typename T> MyClass(const T&);
};

不提供復制構造函數,並生成默認值。

除非您定義自己的復制構造函數,否則始終會創建默認的復制構造函數。 沒有參數的構造函數沒有定義任何其他構造函數,以避免調用它,因此跳過真正的構造函數的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM