繼承建構函式的引入原因:如果基類的建構函式很多,那麼子類的建構函式想要實現同樣多的構造介面,必須一一呼叫基類的建構函式,有點麻煩。
於是乎:c++11引入繼承建構函式,子類可以通過使用using宣告來宣告繼承基類的建構函式。
#include usingnamespace
std;
class
_a _a(
int_inint)
_a(double _indouble, int
_inint)
_a(float _infloat, int _inint, const
char*_char)
};class _b : public
_a};
intmain()
使用using _a::_a; 把基類中的建構函式都繼承到派生類_b中, 這樣最開始的那段**就可以擺脫基類那麼多建構函式介面了。
更為精巧的是:c++11標準繼承建構函式被設計為跟派生類中的各種類預設函式(預設構造、析構、拷貝等)一樣,是隱式的。這意味著如果繼承建構函式不被相關**使用,編譯器不會為其產生真正的函式**,這無疑比透傳方案更加節省目標**空間。
但是:繼承建構函式只會初始化基類中的成員變數(畢竟只是從基類繼承下來的), 對於派生類中的變數初始化就無能為力。可以配合另乙個c++11中的新特性: 資料成員就地初始化,來解決這個問題。但是,這種做法導致子類的成員不能在建構函式的引數列表中體現出來。
使用注意點:
(1) c++11中的繼承建構函式特性最有用的場合就是:派生類只是在基類的基礎上新增了幾個新的介面, 這個時候繼承建構函式最能夠展現威力。
(2) 子類繼承了基類的建構函式,那麼子類就不會自動生成預設建構函式。
所以,如果子類新增了自己的成員變數,還是乖乖回到以前的初始化列表中去吧。
所謂委派構造,就是指委派函式將構造的任務委派給目標建構函式來完成這樣一種類構造的方式。
託建構函式允許類中的乙個建構函式通過初始化列表方式來呼叫同乙個類中的另乙個建構函式。可以減少冗餘**和重複**,能提高**的可讀性。
classinfo
info(
int i) : info(i, 'a'
) info(
char e): info(1
, e)
private
: info(
int i, char e): type(i), name(e)
inttype;
char
name;
//...
};
在委託構造的鏈狀關係中,有一點必須注意:就是不能形成委託環。如下:
structrule2
rule2(
int i): rule2('c'
) {}
rule2(
char c): rule2(2
) {}
};
rule2定義中,rule2()、rule2(int)和rule2(char)都依賴於別的建構函式,形成環委託構造關係。這樣的**通常會導致編譯錯誤(gcc好像不會報錯)。
C 11 移動建構函式
移動建構函式是什麼?先舉個例子,你有一本書,你不想看,但我很想看,那麼我有哪些方法可以讓我能看這本書?有兩種做法,一種是你直接把書交給我,另一種是我去買一些稿紙來,然後照著你這本書一字一句抄到稿紙上。顯然,第二種方法很浪費時間,但這正是有些深拷貝建構函式的做法,而移動建構函式便能像第一種做法一樣省時...
C 11 委派建構函式
一 委派建構函式 深入理解c 11 委派構造 就是指委派函式將構造的任務派給了目標建構函式來完成這樣一種類構造的方式。c 11中的委派建構函式是在建構函式的初始化列表位置進行構造的 委派的 基準版本 的建構函式稱為目標建構函式,呼叫 基準版本 的建構函式稱為委派建構函式 舉例 namespace d...
C 11 繼承建構函式
繼承建構函式 基類有多個不同版本的建構函式,子類必須對應建構函式來進行 透傳 如 class base base double d,int i void fun float d class derived public base derived double d,int i base d,i voi...