C++冒号表达式
構造函數后加冒號是初始化表達式:
有四種情況下應該使用初始化表達式來初始化成員:
1:初始化const成員
2:初始化引用成員
3:當調用基類的構造函數,而它擁有一組參數時
4:當調用成員類的構造函數,而它擁有一組參數時。
在程序中定義變量并初始化的機制中,有兩種形式,一個是我們傳統的初始化的形式,即賦值運算符賦值,還有一種是括號賦值,如:?
? int a=10;?
? char b='r';//賦值運算符賦值?
? int a(10);/?
? char b('r');//括號賦值?
以上定義并初始化的形式是正確的,可以通過編譯,但括號賦值只能在變量定義并初始化中,不能用在變量定義后再賦值,冒號初始化是給數據成員分配內存空間時就進行初始化,就是說分配一個數據成員只要冒號后有此數據成員的賦值表達式(此表達式必須是括號賦值表達式),那么分配了內存空間后在進入函數體之前給數據成員賦值,就是說初始化這個數據成員此時函數體還未執行。 對于在函數中初始化,是在所有的數據成員被分配內存空間后才進行的。這樣是有好處的,有的數據成員需要在構造函數調入之后函數體執行之前就進行初始化如引用數據成員,常量數據成員和對象數據成員。
在Student類中有兩個數據成員,一個是常量數據成員,一個是引用數據成員,并且在構造函數中初始化了這兩個數據成員,但是這并不能通過編譯,因為常量初始化時必須賦值,它的值是不能再改變的,與常量一樣引用初始化也需要賦值,定義了引用后,它就和引用的目標維系在了一起,也是不能再被賦值的。所以C?++":"后初始化的機制,使引用和常量數據成員變為可能的,Student類的構造函數應為:?
?
student ::student(int i,int j):a(i),b(j) { } 再比如這個例子: #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; } 這個列子就會出現編譯錯誤,錯誤如下:原因是實例化子類時候先調用父類構造函數再調用子類構造函數,如果在子類構造函數里面初始化父類會導致父類構造函數被調用兩次。請問那句后面的 :A(b) 代表什么啊,為什么要跟個B1基類的構造函數? 答:A(b)實際上是做的是用b初始化A的成員x;既x=b; :是初始化列表方式,具體見總結
- 上一篇: rapidjson的read和write
- 下一篇: 推荐一款cpp解析json工具--rap