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 有常引用,常物件,常資料成員,常成員函式 棧區 記憶體由系統來分配和釋放 堆區 記憶體由程式設計師自己來分配和釋放的 全域性區常量區 區 方法 建構函式與類同名 建構函式沒有返回值 建構函式可...