委托構造 C++11 引入了委托構造的概念,可以在一個構造函數調用另一個構造函數,從而達到簡化代碼的目的: class Base {public:int value1;int value2;Base() { value1 = 1; } Base(int ... ...
委托構造
C++11 引入了委托構造的概念,可以在一個構造函數調用另一個構造函數,從而達到簡化代碼的目的:
class
Base { |
繼承構造
在傳統 C++ 中,構造函數如果需要繼承是需要將參數一一傳遞的,這將導致效率低下。
C++11 利用關鍵字 using 引入了繼承構造函數的概念:
class
Base { |
顯式虛函數重載
在傳統 C++中,經常容易發生意外重載虛函數的事情。例如:
struct
Base { |
SubClass::foo 可能並不是程式員嘗試重載虛函數,只是恰好加入了一個具有相同名字的函數。
另一個可能的情形是,當基類的虛函數被刪除後,子類擁有舊的函數就不再重載該虛擬函數並搖身一變成為了一個普通的類方法.
這將造成災難性的後果。
C++11 引入了 override 和 final 這兩個關鍵字來防止上述情形的發生。
1. override
override 關鍵字將顯式的告知編譯器進行重載.
編譯器將檢查基函數是否存在這樣的虛函數,否則將無法通過編譯:
struct
Base { |
2. final
final 則是為了防止類被繼續繼承以及終止虛函數繼續重載引入的。
struct
Base { |
顯式禁用預設函數
在傳統 C++ 中,如果程式沒有提供,編譯器會生成預設構造函數、複製構造、賦值算符以及析構函數。
另外,C++ 也為所有類定義了諸如 new、delete 這樣的運算符。當程式員有需要時,可以重載這部分函數。
這就引發了一些需求:無法精確控制預設函數的生成行為。
例如:
- 禁止類的拷貝時,必須將賦值構造函數與賦值算符聲明為 private 。
- 編譯器產生的預設構造函數與用戶定義的構造函數無法同時存在。
若用戶定義了任何構造函數,編譯器將不再生成預設構造函數,但有時候我們卻希望同時擁有這兩種構造函數,這就造成了尷尬。
C++11 提供了上述需求的解決方案,允許顯式的聲明採用或拒絕編譯器自帶的函數。例如:
class
Magic { |