走進C 11(七)禁用預設函式

2021-10-10 17:23:45 字數 1033 閱讀 4055

----君子的力量永遠是行動的力量,而不是語言的力量。

在傳統c++中,若使用者沒有提供, 則編譯器會自動為物件生成預設建構函式(default constructor)、 複製建構函式(copy constructor),賦值運算子(copy assignment operator operator=) 以及析構式(destructor)。另外,c++也為所有的類定義了數個全域性運算子(如operator delete及operator new)。當使用者有需要時,也可以提供自定義的版本改寫上述的函式。

問題在於原先的c++無法精確地控制這些預設函式的生成。比方說,要讓型別不能被拷貝,必須將複製建構函式與賦值運算子宣告為private,並不去定義它們。嘗試使用這些未定義的函式會導致編譯期或鏈結期的錯誤。但這種手法並不是乙個理想的解決方案。

此外,編譯器產生的預設建構函式與使用者定義的建構函式無法同時存在。若使用者定義了任何建構函式,編譯器便不會生成預設建構函式;但有時同時帶有上述兩者提供的建構函式也是很有用的。目前並沒有顯式指定編譯器產生預設建構函式的方法。

c++11 允許顯式地表明採用或拒用編譯器提供的自帶函式。例如要求型別帶有預設建構函式,可以用以下的語法:

class magic
顯式地使用default關鍵字宣告使用類的預設行為,對於編譯器來說明顯是多餘的,但是對於**的閱讀者來說,使用default顯式地定義複製操作,則意味著這個複製操作就是乙個普通的預設的複製操作。將預設的操作留給編譯器去實現將更加簡單,更少的錯誤發生 ,並且通常會產生更好的目標**。

「default」關鍵字可以用在任何的預設函式中,而「delete」則可以用於修飾任何函式。例如,我們可以通過下面的方式排除乙個不想要的函式引數型別轉換:

走進C 11(十七)

是的你沒看錯,今天的題目就是 這。有啥好講的?其實經常用模板的人可能一不小心都吃過這個虧。對於c 程式設計師來說,是位右移操作符,但在一此應用中會涉及到需要連寫的情景,例如 模板和表示式轉換。在例項化模板時會出現連續兩個右尖括號,同樣static cast dynamic cast reinterp...

走進C 11(五) 繼承構造

你的人生不會辜負你的。那轉錯的彎,流下的淚水,滴下的汗水,全都讓你成為獨一無二的自己。只是努力了一陣子,但一遇到困難就各種憂傷,好像自己努力了很久一樣。繼承構造 在繼承體系中,假設派生類想要使用基類的建構函式,必須要在建構函式中顯式宣告。舉個小例子 class basebase int value ...

C 11 模板函式的預設模板引數

一 深入理解c 11 裡的兩句話 c 98中,引入了函式模板和類模板,允許模板類宣告的時候有預設模板引數,但是不支援函式模板。c 11 開始支援,區別是模板函式的預設模板引數不需要 從右往左 依次指定。特別,模板引數的預設形參不是模板引數推導的依據。二 include 模板類的預設模板引數的順序從右...