建構函式有個特殊的初始化方式叫「初始化表示式表」(簡稱初始化表)。初始化表位於函式引數表之後,卻在函式體 {} 之前。這說明該表裡的初始化工作發生在函式體內的任何**被執行之前。
建構函式初始化表的使用規則:
如果類存在繼承關係,派生類必須在其初始化表裡呼叫基類的建構函式。
例如class a
;class b : public a
;b::b(int x, int y)
: a(x) // 在初始化表裡呼叫a 的建構函式
類的 const 常量只能在初始化表裡被初始化,因為它不能在函式體內用賦值的方式來初始化(參見5.4 節)。
類的資料成員的初始化可以採用初始化表或函式體內賦值兩種方式,這兩種方式的效率不完全相同。
非內部資料型別的成員物件應當採用第一種方式初始化,以獲取更高的效率。例如
class a
;class b
;示例 9-2(a)中,類b 的建構函式在其初始化表裡呼叫了類a 的拷貝建構函式,從而將成員物件m_a 初始化。
示例 9-2 (b)中,類b 的建構函式在函式體內用賦值的方式將成員物件m_a 初始化。
我們看到的只是一條賦值語句,但實際上b 的建構函式幹了兩件事:先暗地裡建立m_a物件(呼叫了a 的無引數建構函式),再呼叫類a 的賦值函式,將引數a 賦給m_a。
對於內部資料型別的資料成員而言,兩種初始化方式的效率幾乎沒有區別,但後者的程式版式似乎更清晰些。若類f 的宣告如下:
class f
示例9-2(c)中f 的建構函式採用了第一種初始化方式,示例9-2(d)中f 的建構函式採用了第二種初始化方式。
建構函式和初始化表
1.無參構造 預設建構函式 無參並非嚴格的沒有引數的建構函式,而是不需要提供實際引數的建構函式,比如存在有預設引數 integer integer int a 10 也算是預設建構函式,可以無參呼叫。integer p1 new integer integer p2 new integer inte...
建構函式和初始化表
include class account 注意 建構函式的初始化列表只在建構函式的定義中指定,而不在宣告中指定 inline account account const char name,double opening bal name name balance opening bal 成員初始化...
建構函式的初始化
一般成員變數的初始化有兩種方式 1 在建構函式體內進行賦值操作 class abc abc abc const std string name,const std string addres,const std list phones 這裡每個成員都是直接賦值操作,因為初值已經有預設建構函式完成了。...