c 中建構函式和初始化列表

2021-10-05 04:41:43 字數 1507 閱讀 8975

我不是筆記的創造者,我只是筆記的搬運工~

1 ,建構函式可以過載,也可以帶有預設引數          

匹配string的無參建構函式

string s;

匹配string的有參(const char*)建構函式      

string s("hello");

2 ,預設建構函式(無參建構函式)

1)如果類中沒有定義任何建構函式,編譯器會為該類提供乙個預設(無參)建構函式:

--》對於基本型別成員變數不做初始化

--》對於類 型別的成員變數(成員子物件),將會自動呼叫相應類的無參建構函式來初始化

2)如果自己定義了建構函式,無論是否有引數,那麼編譯器都不會再提供預設的無參建構函式了.

3 ,型別轉換建構函式(單參建構函式) //建構函式的型別轉換   

class 類名

};-----------------------------------

class 類名

4, 拷貝建構函式(複製建構函式)

這部分我覺得還挺難理解的 

1)用乙個已存在的物件作為同類物件的構造實參,建立新的副本物件時,會呼叫該類拷貝建構函式。

class 類名

};------------

eg:class a;

a a1(...);

a a2(a1);//匹配a的拷貝建構函式

2)如果乙個類沒有自己定義拷貝建構函式,那麼編譯器會為該類提供乙個預設的拷貝建構函式:

--》對於基本型別的成員變數,按位元組複製

--》對於類型別的成員變數(成員子物件),將自動呼叫相應類的拷貝建構函式來初始化

注:一般不需要自己定義拷貝建構函式函式,因為編譯器預設提供的已經很好用了.

class a1{};//預設無參,預設拷貝

class a2

};class a3

};class a4

};3)拷貝構造函式呼叫時機

--》用乙個已存在物件作為同類物件的構造實參

--》以物件形式向函式傳遞引數

--》從函式中返回物件(有可能被編譯器優化掉)

建構函式初始化列表和初始化函式

其實並沒有所謂的初始化函式的概念,本文中的初始化函式只是說明在函式體內進行賦值。而初始化列表才是真正意義上的物件初始化。使用初始化列表效率會高一點。c 規定,物件的成員變數的初始化動作發生在進入建構函式本體之前。在建構函式體內只是賦值,並不是初始化。請看下面這個栗子 class base publi...

C 建構函式 ,初始化列表

c 中的類的建構函式 1.如果類中沒有定義建構函式,編譯器將生成乙個預設建構函式,這個預設建構函式會呼叫類中所有成員的預設建構函式,但不會對如int,double的基本資料型別做初始化 2.類中可以定義多個建構函式,但每個建構函式應該有不同的引數實現 3.預設建構函式必須定義的情況,當需要定義乙個物...

C 建構函式初始化列表

從概念上講,可以認為建構函式分兩個階段進行 1.初始化階段 2.普通的計算階段。計算階段由建構函式函式體中的所有語句組成 不管成員是否在建構函式初始化列表中顯示初始化,類型別的資料成員總是在初始化階段初始化。初始化發生在計算階段的開始之前。建議 使用建構函式初始化列表 注 必須對任何const或引用...