Posted on 2007-08-30 10:28
寶杉 閱讀(207)
評論(0) 編輯 收藏 引用 所屬分類:
C++
析構(gòu)函數(shù)
構(gòu)造函數(shù)初始化表:構(gòu)造函數(shù)特殊的初始化方式“初始化表達(dá)式表”(簡稱初始化表)。
初始化表位于函數(shù)參數(shù)表之后,卻在函數(shù)體 {} 之前。這說明該表里的初始化工作發(fā)生在函數(shù)體內(nèi)的任何代碼被執(zhí)行之前。
規(guī)則
u 如果類存在繼承關(guān)系,派生類必須在其初始化表里調(diào)用基類的構(gòu)造函數(shù)。
u 類的const常量只能在初始化表里被初始化,因為它不能在函數(shù)體內(nèi)用賦值的方式來初始化。
u 類的數(shù)據(jù)成員的初始化可以采用初始化表或函數(shù)體內(nèi)賦值兩種方式,這兩種方式的效率不完全相同。
效率
1 內(nèi)部成員:
初始化表和函數(shù)體內(nèi)賦值都可以,但效率不完全相同,但后者更為清晰直觀。
例子:
class F
{
public:
F(int x, int y); // 構(gòu)造函數(shù)
private:
int m_x, m_y;
int m_i, m_j;
}
F::F(int x, int y)
: m_x(x), m_y(y)
{
m_i = 0;
m_j = 0;
}
|
F::F(int x, int y)
{
m_x = x;
m_y = y;
m_i = 0;
m_j = 0;
}
|
示例9-2(c) 數(shù)據(jù)成員在初始化表中被初始化 示例9-2(d) 數(shù)據(jù)成員在函數(shù)體內(nèi)被初始化
兩種方式效率區(qū)別不大。
2 非內(nèi)部成員:
只能用初始化表,提高效率。
例子:
class A
{…
A(void); // 無參數(shù)構(gòu)造函數(shù)
A(const A &other); // 拷貝構(gòu)造函數(shù)
A & operate =( const A &other); // 賦值函數(shù)
};
class B
{
public:
B(const A &a); // B的構(gòu)造函數(shù)
private:
A m_a; // 成員對象
};
比較與分析:
B::B(const A &a)
: m_a(a)
{
…
}
|
B::B(const A &a)
{
m_a = a;
…
}
|
1 B類構(gòu)造函數(shù)的初始化里,調(diào)用了A類的拷貝構(gòu)造函數(shù)。
2 B類構(gòu)造初始化里,隱藏了以下幾個步驟:
先創(chuàng)建了a對象,調(diào)用了A類的無參數(shù)構(gòu)造函數(shù);
把a賦值給m_a,調(diào)用了A類的賦值函數(shù);
深入探討:
構(gòu)造和析構(gòu)的次序?
構(gòu)造從最深處的基類開始的,先一層層調(diào)用基類的構(gòu)造函數(shù),然后調(diào)用成員對象的構(gòu)造函數(shù)。
而析構(gòu)函數(shù)嚴(yán)格按照構(gòu)造函數(shù)相反的次序執(zhí)行,該次序唯一,以便讓編譯器自動執(zhí)行析構(gòu)函數(shù)。
特別之處是,成員對象初始化次序不受構(gòu)造函數(shù)初始化表次序影響,由在類中聲明的次序決定。而類聲明是唯一的,構(gòu)造函數(shù)卻可能有多個,所以有多個不同次序函數(shù)初始化表。如果按照構(gòu)造函數(shù)的次序構(gòu)造,那么解析函數(shù)不能得到唯一的逆序。