很久沒(méi)有碰C++,下個(gè)項(xiàng)目要開(kāi)始使用C++,所以很多東西需要撿起來(lái)重新看看。從今天起記錄一些筆記,方便自己今后查閱。言歸正傳,先從構(gòu)造函數(shù)的初始化列表說(shuō)起。我把這個(gè)知識(shí)點(diǎn)細(xì)化成3個(gè)問(wèn)題,1.為什么要有初始化列表,它和構(gòu)造函數(shù)中初始化有什么不一樣。2.初始化的順序。3.一些注意的細(xì)節(jié)。
先說(shuō)第一個(gè)問(wèn)題。我們有兩個(gè)東西,是必須在初始化列表里完成的,一個(gè)是const修飾的變量,一個(gè)是引用。這點(diǎn)我就不細(xì)說(shuō)了,查閱資料的都可以找到。下面我具體說(shuō)說(shuō)類(lèi)成員。
class Test1{
public:
Test1()
{
cout << "Test1 default constructor" << endl;
}
Test1(int i)
{
cout << "Test1 value constructor" << endl;
}
Test1(const Test1 &obj)
{
cout << "Test1 copy constructor" << endl;
}
Test1& operator = (const Test1 &obj)
{
cout << "Test1 = constructor" << endl;
return *this;
}
~Test1()
{
cout << "Test1 destructor" << endl;
}
};
我定義一個(gè)類(lèi),然后再定義一個(gè)類(lèi),其中包含Test1
class Test2
{
public:
Test2()
{
t1 = Test1(1);
}
private:
Test1 t1;
};
我們?cè)跇?gòu)造函數(shù)中初始化Test1,我們看看運(yùn)行結(jié)果
Test1 default constructor
Test1 value constructor
Test1 = constructor
Test1 destructor
Test1 destructor我們分析下這個(gè)輸出。Test1 default constructor,這說(shuō)明在進(jìn)入Test1構(gòu)造函數(shù)之前,已經(jīng)初始化了t1成員,并且調(diào)用的是無(wú)參構(gòu)造函數(shù)。Test1 value constructor這個(gè)是Test1(1)創(chuàng)建出來(lái)的對(duì)象。Test1 = constructor,這個(gè)表示條用了拷貝構(gòu)造函數(shù),Test1 destructor這個(gè)表示Test1(1)這個(gè)臨時(shí)對(duì)象的析構(gòu),Test1 destructor這個(gè)表示是t1這個(gè)成員對(duì)象的析構(gòu)。從上面的結(jié)果來(lái)看,構(gòu)造函數(shù)中t1 = Test1(1);其實(shí)并不是真正意義是上的初始化,而是一次拷貝賦值。當(dāng)進(jìn)入構(gòu)造函數(shù)內(nèi)部之前,類(lèi)成員會(huì)被默認(rèn)構(gòu)造函數(shù)初始化。如果說(shuō)Test1是個(gè)很大的對(duì)象,這塊會(huì)造成性能上的開(kāi)銷(xiāo)。所以,這點(diǎn)也是使用初始化列表的原因之一。
第二我們?cè)賮?lái)說(shuō)下順序問(wèn)題。簡(jiǎn)單的原則是初始化列表里的會(huì)先于構(gòu)造函數(shù)中,初始化列表里會(huì)按照變量聲明的順序。我們具體看看下面的例子。
class Test3(){
public:
Test3(int x,int y,int z):_z(z),_y(y)
{
_x = x;
}
private:
int _x,_y,_z;
};
按照上面的說(shuō)法,賦值的順序是_y,_z,_x。
第三個(gè)是注意問(wèn)題,每個(gè)成員只能在初始化列表里出現(xiàn)一次。
class Test3{
public:
Test3(int x,int y,int z):_z(z),_y(y),_z(x)
{
_x = x;
}
private:
int _x,_y,_z;
};
比如這種就是問(wèn)題的。_z被初始化了2次。
posted on 2012-08-14 10:24
梨樹(shù)陽(yáng)光 閱讀(1464)
評(píng)論(3) 編輯 收藏 引用 所屬分類(lèi):
C++