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

- 關鍵字的使用


二、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()的定義則非法。


