2016-12-04 36 views
3

亮度在Orbit的的說明中,我縮小了我的帖子。C++規則零和什麼是「用戶聲明」的構造函數?

看完這篇文章:The Rule of Zero

我才明白最,但我還是想解決一些明確的問題,我有:

看着這句話:

如果類X的定義沒有明確聲明移動構造函數,當且僅當:

時,將隱式聲明爲默認值

X沒有一個用戶聲明的拷貝構造函數,

X沒有一個用戶聲明的拷貝賦值運算符,

X沒有一個用戶聲明的舉動賦值運算符,

X沒有一個用戶聲明析構函數,

此舉構造不會爲刪除被隱式定義。

是否所有5個語句共存(共享一個「和」關係)或只有其中一些(共享一個「或」關係)?

2.什麼「用戶聲明」複製構造函數\複製賦值運算符...意味着什麼?

  • 在.h文件中聲明它(以上列表中的任何一個)但未實現它認爲用戶聲明?

  • 是在h文件聲明它(上面列表中的任何一個),並指定「=刪除」或「=默認」考慮用戶聲明的?

  • 正在用空手鐲{}認定用戶聲明的.h文件中聲明它(上面的任何一個列表)。

尊敬,

Etay

+0

這似乎是一個很多的問題。 –

+0

嗯,我想避免打開單獨的問題,因爲我認爲這是一個負擔。 此外,在我看來,所有問題都強調同一主題的不同細微差別。 – Etay

+0

不,當你每個問題發佈多個問題時,這是更多的負擔。請縮小你的帖子。 –

回答

1

用戶聲明的構造是已經寫的程序員,而不是由編譯器添加了一個構造函數。在這種情況下,用戶定義與默認或隱式相反。

除非您的課程中出現任何這種情況,否則您的課程將擁有隱式默認移動構造函數。所以,這是一個「消極的」。它們都不會發生隱式默認移動構造函數。

我所有提到的情況下,構造函數都是使用聲明的,即使在刪除時也是如此。

這些規則的原因是與pre-C++-11的兼容性。當用戶聲明一個拷貝構造函數時,臨時對象也被髮送給它們。如果你去了一個C++ 11編譯器,並且移動構造函數是不加區分的,那麼行爲就會改變。之前調用複製構造函數的調用現在轉到用戶可能不知道的幻影移動構造函數。因此,每當編譯器看到複製構造函數或賦值運算符(意​​味着該類管理自己的資源)時,就不考慮C++ 11之前的行爲回退和移動構造函數。

+0

Peregring-Ik - 非常感謝解釋! – Etay