C 11新特性(58) 刪除的拷貝控制和繼承

2021-08-22 01:15:34 字數 971 閱讀 6918

本標題來自c++ primer 5,作者也沒有看懂。

作為c++11的新特性,允許程式設計師將某些函式定義為刪除的以限制這些功能被使用。

引入了繼承概念以後,事情變得稍微複雜一些。

**示例

例如下面的基類:

這 個類只有乙個資料成員,定義了預設建構函式,拷貝建構函式,移動建構函式,賦值運算子,移動運算子和析構函式。這些函式有乙個共同特點:都是負責構造,復 制和銷毀類例項的資料成員,負責類資源的管理。當這個類被繼承時,相應的函式也會被重寫,但是一般來講派生類的類似操作中會呼叫基類的對應成員:

但是一旦基類中使用=delete來宣告基類的某個成員函式為刪除的,那麼派生類中的對應函式也會自動地變成刪除的。

觀察下面的**:

如果sub類沒有從base類繼承,由於有預設生成的函式,**是可以通過編譯的;一旦修改為從base繼承,main函式中的對用操作就會出現編譯錯誤。

其原因就是因為基類中的對應函式已經被定義為刪除的了。

作者觀點

按照作者的理解,原因可能是由於存在下面的關係:

派生類  is a 基類

也就是說:從語義上講派生類的操作都應該包含基類的對應操作,一旦基類中的對應操作被宣告為刪除的,就意味這關於基類的那部分動作無法進行。為了安全起見,c++於是也認為派生類中的對應函式也是刪除的。

c 11的新特性

1 型別說明符auto 2.decltype提取型別 int a 0 decltype a b b 10 cout b endl 3.基於範圍的for迴圈 4.虛函式的override和final指示符 final修飾類 類無法被繼承 final修飾虛函式 虛函式不能被重寫 override就是輔助...

C 11的新特性

c 11提供在類中定義類的資料成員,可以直接在成員之後新增 預設值 當通過編譯器自動生成的預設建構函式初始化物件時,對應的資料成員就會被初始化成對應的預設值。class test int main 在c 98中,陣列可以使用 來進行初始化,對自定義型別是不可以的。在c 11中,的使用範圍變得更廣,可...

C 11的新特性

1.auto關鍵字 編譯器可以根據初始值自動推導出型別。但是不能用於函式傳參以及陣列型別的推導。2.nullptr關鍵字 nullptr是一種特殊型別的字面值,它可以被轉換成任意其它的指標型別 而null一般被巨集定義為0,在遇到過載時可能會出現問題。3.智慧型指標 c 11新增了std share...