C++2.0新特性(三)——<=default,=delete、alias(別名)、noexcept、override、final、以及和const對比>


一、=default,=delete

1、首先我們要回顧一下類默認函數的概念:

  • C++中,當我們設計與編寫一個類時,若不顯著申明,則類會默認為我們提供如下幾個函數:

(1)構造函數(A())、(2)析構函數(~A())、(3)拷貝構造函數(A(A&))、(4)拷貝賦值函數(A& operator=(A&))、(5)移動構造函數(A(A&&))、(6)移動賦值函數(A& operator=(A&&))

注意:拷貝函數如果涉及指針就要區分淺拷貝(指針只占4字節,淺拷貝只把指針所占的那4個字節拷貝過去)和深拷貝(不僅要拷貝指針所占的字節,還要把指針所指的東西也要拷貝過去);

  • 以及全局的默認操作符函數

(1)operator,(2)operator &,(3)operator &&,(4)operator *,(5)operator->,(6)operator->*,(7)operator new,(8)operator delete。

2、何時需要自定義big—three(構造函數、拷貝構造、拷貝賦值)/big-five(新增移動構造函數、移動賦值函數)

  如果類中帶有point member(指針成員),那我們就可以斷定必須要給出big-three,如果不帶,絕大多與情況下就不必給出big-three,用默認的就好。

3、關鍵字使用示例

  1. 如下圖所示,分別是構造函數、拷貝構造函數、移動構造函數(Zoo&&表示得是右值引用)、賦值函數、移動賦值函數等5種成員函數,default和delete基本就作用再這5種函數上,由於c++中,如果你自定義了這5種函數,編譯器就不會再為你生成默認的相關函數,但是如果我們再后邊加上=default關鍵字,就可以重新獲得並使用編譯器為我們生成的默認函數(顯式缺省:告知編譯器即使自己定義了也要生成函數默認的缺省版本));
  2. =delete相對於上面來說則是相反的,=delete表示不要這個函數,就是說這個函數已經刪除了不能用了,一旦別人使用就會報錯(顯式刪除:告知編譯器不生成函數默認的缺省版本),引進這兩種新特性的目的是為了增強對“類默認函數的控制”,從而讓程序員更加精准地去控制默認版本的函數。
  3. 關鍵字的使用

 二、alias(別名、化名)

1、using在2.0有了新的意義,用來表示別名化的語法

  用using聲明別名化,且這個別名化是可以帶參數的,同樣具有別名化意思的還有define(也可以帶參數),typedef(不能帶參數),但它們在特殊時候都無法代替using,但是不能對別名化的名稱做特化或偏特化,只能對原名做(化名不能代替本尊)

 2、所有using的使用情況歸類

 三、noexcept

  noexcept用於申明函數保證不會拋出異常,后面可以跟一個括號寫一個條件,也就是說在某種條件滿足情況下,不會拋出異常,一般異常處理流程:當程序發生異常時會將異常信息上報返回給調用者,如果有異常處理則處理,如果該調用者沒有處理異常則會接着上報上一層,若到了最上層都沒有處理,就會調用std::terminate()->std::abort(),然后終止程序。

四、override

  override用於明確要重寫父類的虛函數上,相當於告訴編譯器這個函數就是要重寫父類虛函數這樣一個意圖,讓編譯器幫忙檢查,而沒有這個關鍵字,編譯器是不會幫你檢查的

五、final

  final新增兩種功能:(1)、禁止基類被繼承,(2)、禁止虛函數被重寫;

六、const

  該部分參考轉載:https://blog.csdn.net/u011327981/article/details/77656866

  這是個人新的總結,非語法部分,目的是為了對比以上final和override.

  • 在C++中,若一個變量聲明為const類型,則試圖修改該變量的值的操作都被視編譯錯誤

 

  •  只有被聲明為const的成員函數才能被一個const類對象調用

 

  • 若成員成員函數聲明為const,則該函數不允許修改類的數據成員

 

在上面成員函數的定義中,ok()的定義是合法的,error()的定義則非法。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM