C11建構函式的改善

2022-05-07 00:48:12 字數 1570 閱讀 1886

委託建構函式就是允許在同乙個類中乙個建構函式可以呼叫另乙個建構函式,從而在初始化時簡化變數的初始化。

class

ctest

ctest(

int a, int

b)

ctest(

int a, int b, int

c)

~ctest(){}

};

這個例子表明,在成員變數眾多、變數的初始化比較複雜的情況下,建構函式的工作是重複且繁瑣的,那麼就可以通過委託建構函式來解決問題。

class

ctest

ctest(

int a, int

b) : ctest(a)

ctest(

int a, int b, int

c) : ctest(a, b)

~ctest(){}

};

這樣優化之後,**更加的簡潔明瞭,但是這種鏈式呼叫不能形成乙個環,否則會在執行時候拋異常。其次,使用了**建構函式就不能使用類成員初始化了。

class

ctest

//error:呼叫了建構函式不能進行初始化

ctest(int a, int

b) : ctest(a), y

//ok,呼叫了建構函式,可以在函式內部進行賦值

ctest(int a, int b, int

c) : ctest(a, b)

~ctest(){}

};

c++11的整合建構函式可以讓派生類直接使用基類的建構函式,而無需自己再寫建構函式,特別是基類建構函式比較多的情況下,可以極大的簡化派生類建構函式的編寫。

structa;

a(int a, int

b): x(a), y(b) {};

//...其他建構函式

};

如果派生類僅僅是增加基類某些行為,並沒有增加變數,那麼希望採取基類一樣的構造方式,是不能直接使用基類的建構函式的,因為派生類會隱藏基類的同名函式。

struct b : publica;

intmain()

通過基類的建構函式去構造派生類的物件是不合法的,因為派生類的預設建構函式隱藏了基類,如果希望使用基類的建構函式,常規的做法是在派生類定義。

struct b : publica;

b(int a, int

b): a(a, b) {};

//...其他基類建構函式

};

通過這個方法解決了和基類一樣的構造行為,但是過程既繁瑣又重複,c++11中解決了派生類隱藏基類同名函式的問題,通過using base::somefunction來表示使用基類的同名函式,如果是建構函式,使用using base::base來宣告使用基類的建構函式,這樣就避免了定義相同的建構函式來保持和基類一樣的初始化行為,使用基類的建構函式來構造派生類物件。但是需要注意的是,整合建構函式不會去初始化派生類新定義的資料成員。

struct b : public

a;

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...