C++冒号表达式
構(gòu)造函數(shù)后加冒號(hào)是初始化表達(dá)式:
有四種情況下應(yīng)該使用初始化表達(dá)式來(lái)初始化成員:
1:初始化const成員
2:初始化引用成員
3:當(dāng)調(diào)用基類的構(gòu)造函數(shù),而它擁有一組參數(shù)時(shí)
4:當(dāng)調(diào)用成員類的構(gòu)造函數(shù),而它擁有一組參數(shù)時(shí)。
在程序中定義變量并初始化的機(jī)制中,有兩種形式,一個(gè)是我們傳統(tǒng)的初始化的形式,即賦值運(yùn)算符賦值,還有一種是括號(hào)賦值,如:?
? int a=10;?
? char b='r';//賦值運(yùn)算符賦值?
? int a(10);/?
? char b('r');//括號(hào)賦值?
以上定義并初始化的形式是正確的,可以通過(guò)編譯,但括號(hào)賦值只能在變量定義并初始化中,不能用在變量定義后再賦值,冒號(hào)初始化是給數(shù)據(jù)成員分配內(nèi)存空間時(shí)就進(jìn)行初始化,就是說(shuō)分配一個(gè)數(shù)據(jù)成員只要冒號(hào)后有此數(shù)據(jù)成員的賦值表達(dá)式(此表達(dá)式必須是括號(hào)賦值表達(dá)式),那么分配了內(nèi)存空間后在進(jìn)入函數(shù)體之前給數(shù)據(jù)成員賦值,就是說(shuō)初始化這個(gè)數(shù)據(jù)成員此時(shí)函數(shù)體還未執(zhí)行。 對(duì)于在函數(shù)中初始化,是在所有的數(shù)據(jù)成員被分配內(nèi)存空間后才進(jìn)行的。這樣是有好處的,有的數(shù)據(jù)成員需要在構(gòu)造函數(shù)調(diào)入之后函數(shù)體執(zhí)行之前就進(jìn)行初始化如引用數(shù)據(jù)成員,常量數(shù)據(jù)成員和對(duì)象數(shù)據(jù)成員。
在Student類中有兩個(gè)數(shù)據(jù)成員,一個(gè)是常量數(shù)據(jù)成員,一個(gè)是引用數(shù)據(jù)成員,并且在構(gòu)造函數(shù)中初始化了這兩個(gè)數(shù)據(jù)成員,但是這并不能通過(guò)編譯,因?yàn)槌A砍跏蓟瘯r(shí)必須賦值,它的值是不能再改變的,與常量一樣引用初始化也需要賦值,定義了引用后,它就和引用的目標(biāo)維系在了一起,也是不能再被賦值的。所以C?++":"后初始化的機(jī)制,使引用和常量數(shù)據(jù)成員變?yōu)榭赡艿?#xff0c;Student類的構(gòu)造函數(shù)應(yīng)為:?
?
student ::student(int i,int j):a(i),b(j) { } 再比如這個(gè)例子: #include "stdafx.h" #include<iostream>using namespace std;class A { public:int x;A(int a=0){cout<<"A Constructed\n";x=a;}~A(){cout<<"A dis Constructed\n";} }; class B1:public A { public:int y1;B1(int test1=0,int test2=0)/*:A(b)*/ //就是這句{cout<<"B Constructed\n";int testtt = 10;A(testtt);y1=test1; }~B1(){cout<<"B dis Constructed\n";} };int _tmain(int argc, _TCHAR* argv[]) {B1 b;return 0; } 這個(gè)列子就會(huì)出現(xiàn)編譯錯(cuò)誤,錯(cuò)誤如下:原因是實(shí)例化子類時(shí)候先調(diào)用父類構(gòu)造函數(shù)再調(diào)用子類構(gòu)造函數(shù),如果在子類構(gòu)造函數(shù)里面初始化父類會(huì)導(dǎo)致父類構(gòu)造函數(shù)被調(diào)用兩次。請(qǐng)問(wèn)那句后面的 :A(b) 代表什么啊,為什么要跟個(gè)B1基類的構(gòu)造函數(shù)? 答:A(b)實(shí)際上是做的是用b初始化A的成員x;既x=b; :是初始化列表方式,具體見(jiàn)總結(jié)
- 上一篇: rapidjson的read和write
- 下一篇: C++静态多态(模版模拟多态)的讨论