C 建構函式的幾個難點(基於C 11)

2021-06-28 04:23:35 字數 1482 閱讀 7302

快要有乙個月沒有更新部落格了,是時候再動一動筆啦!因為最近在學習c++,在學習過程中看了好多書,也在實際訓練中遇到了一些問題。所以在接下來的時間裡,應該會對c++裡自己遇到的一些難點寫幾篇專題,就當是為自己梳理鞏固知識啦!

我們都知道所謂建構函式就是類用來初始化各個資料成員的(非靜態),如果成員都沒初始化好,那麼在對類的後續操作中肯定會遇到各種莫名其妙的錯誤。所以,我們有必要對建構函式做乙個全面的了解,知道在各種情況下,建構函式都是怎樣執行的,這樣才能對類進行完美的控制。

預設建構函式:

class base

base(base& b):s(b.s),a(b.a){}

void print()

private:

int b=0;

};

在上面的**中,derived類是base類的繼承類。在類的繼承當中有乙個非常重要的原則,那就是自己幹自己的事情。例如,在初始化繼承類的過程中,繼承類的父類部分,它是不管的,只是將引數傳給父類的建構函式,讓它自己去初始化好了,它要做的是初始化自己新增加的部分。那麼問題就來了,在繼承類的賦值建構函式中,繼承類部分的賦值是沒有問題的,但是基類部分怎麼辦呢?因為基類的賦值建構函式要求的是基類的物件,但是引數是繼承類。如果想要對基類的成員乙個乙個賦值也是不現實的,因為繼承類物件是不能訪問基類部分的私有成員的。那怎麼辦呢?很簡單,把繼承類物件作為引數賦值給基類的賦值建構函式。雖然基類的賦值建構函式要求的引數是基類物件的引用,但是顯然,繼承類物件的包含基類的。因此,只要把繼承類物件傳遞過去,系統會自動將基類部分完成初始化。對於繼承類的建構函式,還有一點需要注意到是初始化的順序。我們可以把整個類的繼承看做一棵樹,那麼當前所在的繼承類就可以看做是葉子節點。這樣看來就很簡單了,對於繼承類的初始化過程就是從樹根到樹葉逐步初始化的過程。就如上面的**,在初始化derived類的物件的時候,先初始化它的base部分,然後再初始化它自己新新增的部分。

多繼承類的建構函式:

多繼承類建構函式的運作方式其實和單繼承類是類似的。不過有一點需要特別注意的是,當多繼承類中存在虛基類的時候,為了防止虛基類被重複構造。我們再當前類的建構函式中就要對其進行初始化。例如,我們有如下繼承關係:a->b1->c,a->b2->c。其中a是c的虛基類。如果我們還是按照單繼承的方式進行初始化,顯然,因為有兩條路徑,所以a會被初始化兩次。所以我們在構造c的時候先要對虛基類進行初始化並且c的建構函式應採用如下格式:

c(...):a(...),b1(..),b2(...)...

即使沒有將a的建構函式顯式宣告,系統依然會先預設初始化a。並且由於多類繼承從左往右的初始化順序,這四個類將按照:a,b1,b2,c的順序完成初始化。

以上這些內容就是我對c++建構函式中存在的難點進行的一些總結。

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