天天看點

阻止拷貝

大多數類應該定義預設構造函數、拷貝構造函數和拷貝指派運算符,無論是隐式的還是顯式的。

雖然大多數類應該定義(而且通常也的确定義了)拷貝構造函數的拷貝指派運算符,但對某些類來說,這些操作沒有合理的意義。

定義删除的函數

在新标準下,我們可以通過将拷貝構造函數和拷貝指派運算符定義為删除的函數來阻止拷貝。删除的函數是這樣一種函數:我們雖然聲明了它們,但不能以任何方式使用它們。

與=default不同,=delete必須出現在函數第一次聲明的時候。

析構函數不能是删除的成員

如果析構函數被删除,就無法銷毀此類型的對象了。

對于删除了析構函數的類型,雖然我們不能定義這種類型的變量或成員,但是可以動态配置設定這種類型的對象。但是,不能釋放這些對象。

合成的拷貝控制成員可能是删除的

對某些類來說,編譯器将這些合成的成員定義為删除的函數:

1。如果類的某個成員的析構函數是删除的或不可通路的,則類的合成析構函數被定義為删除的。

2。如果類的某個成員的拷貝構造函數是删除的或不可通路的,則類的合成拷貝構造函數被定義為删除的。如果類的某個成員的析構函數是删除的或不可通路的,則類的合成拷貝構造函數也被定義為删除的。

3。如果類的某個成員的拷貝指派運算符是删除的或不可通路的,或是類有一個const的或引用成員,則類的合成拷貝指派運算符被定義為删除的。

4。如果類的某個成員的析構函數是删除的或不可通路的,或是類有一個引用成員,它沒有類内初始化器,或是類有一個const成員,它沒有類内初始化器且類型未顯式定義預設構造函數,則該類的預設構造函數被定義為删除的。

本質上,這些規則的含義是:如果一個類有資料成員不能預設構造、拷貝、複制或銷毀,則對應的成員函數将被定義為删除的。

本質上,當不可能拷貝、指派或銷毀類的成員時,類的合成拷貝控制成員就被定義為删除的。

繼續閱讀