建構函式和初始化表

2021-08-17 14:59:46 字數 1316 閱讀 6253

1.無參構造-預設建構函式

無參並非嚴格的沒有引數的建構函式,而是不需要提供實際引數的建構函式,比如存在有預設引數

integer::integer(int a = 10);//也算是預設建構函式,可以無參呼叫。

integer* p1 = new integer();

integer* p2 = new integer;

integer i();

integer i;//建議方式

關於物件的無參構造在使用時可以不用()的不帶();

第三種構造方式下,如果該integer不存在無參建構函式,會直接將其當做函式宣告從而可能引發編譯器報錯。

2.單參構造-型別轉換構造

單參建構函式,向編譯器提供一種隱式的型別轉換。

explicit integer::integer(int data);

3.拷貝構造 

拷貝建構函式必須傳遞引用型引數。

integer::integer(integer const& that);     

即如果乙個類如果只有乙個建構函式,則一定是拷貝建構函式。

另外:  如果傳遞非引用引數,則會通過拷貝構造形成乙個匿名的integer副本,導致無限呼叫自身,陷入死迴圈。

初始化表:

初始化表不是執行過程,而是指導成員變數的定義和初始化,初始化過程是按照類中成員變數的宣告順序,而非初始化表中的順訊。

初始化表在以下情況下必要:

類的類型別成員變數,要麼在初始化表中顯式的初始化,要麼通過相應型別的預設建構函式初始化。

但是,如果類成員沒有預設建構函式,則必須使用初始化表來初始化。

class a 

int m_data;

};class b

a m_a; //b無法預設構造,因為a無法預設構造。

};

另外類的常量型和引用型成員變數,必須在初始化表中顯示初始化,不能在建構函式體中初始化。

本質上,初始化表中的宣告屬於類成員的定義並初始化,而建構函式體中屬於賦值。

故而:常量型和引用型成員因為必須在定義時就初始化,所以必須在初始化表中進行顯式初始化。

建構函式的執行順序:

用a類定義乙個物件或指向a物件的指標,首先是分配sizeof(a)的記憶體,然後呼叫a的建構函式,進行初始化a的物件。

也是new包含malloc和呼叫a:a(...)建構函式。

父子類的構造析構順序:

構造時先呼叫基類的建構函式,再呼叫派生類的建構函式

析構時先呼叫派生類的析構函式,再呼叫基類的析構函式。   

建構函式和初始化表

include class account 注意 建構函式的初始化列表只在建構函式的定義中指定,而不在宣告中指定 inline account account const char name,double opening bal name name balance opening bal 成員初始化...

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

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

初始化列表和建構函式

const的資料成員和需要用初始化列表,不能用普通的建構函式體內部進行初始化,這稱為常資料成員。const 有常引用,常物件,常資料成員,常成員函式 棧區 記憶體由系統來分配和釋放 堆區 記憶體由程式設計師自己來分配和釋放的 全域性區常量區 區 方法 建構函式與類同名 建構函式沒有返回值 建構函式可...