建構函式後加冒號是初始化表示式:
有四種情況下應該使用初始化表示式來初始化成員:
1:初始化const成員
2:初始化引用成員
3:當呼叫基類的建構函式,而它擁有一組引數時
4:當呼叫成員類的建構函式,而它擁有一組引數時。
在程式中定義變數並初始化的機制中,有兩種形式,乙個是我們傳統的初始化的形式,即賦值運算子賦值,還有一種是括號賦值,如:
int a=10;
char b='r';//賦值運算子賦值
int a(10);/
char b('r');//括號賦值
以上定義並初始化的形式是正確的,可以通過編譯,但括號賦值只能在變數定義並初始化中,不能用在變數定義後再賦值,冒號初始化是給資料成員分配記憶體空間時就進行初始化,就是說分配乙個資料成員只要冒號後有此資料成員的賦值表示式(此表示式必須是括號賦值表示式),那麼分配了記憶體空間後在進入函式體之前給資料成員賦值,就是說初始化這個資料成員此時函式體還未執行。 對於在函式中初始化,是在所有的資料成員被分配記憶體空間後才進行的。這樣是有好處的,有的資料成員需要在建構函式調入之後函式體執行之前就進行初始化如引用資料成員,常量資料成員和物件資料成員。
class student
;student ::student (int i,int j)
在student類中有兩個資料成員,乙個是常量資料成員,乙個是引用資料成員,並且在建構函式中初始化了這兩個資料成員,但是這並不能通過編譯,因為常量初始化時必須賦值,它的值是不能再改變的,與常量一樣引用初始化也需要賦值,定義了引用後,它就和引用的目標維繫在了一起,也是不能再被賦值的。所以c ++":"後初始化的機制,使引用和常量資料成員變為可能的,student類的建構函式應為:
student ::student(int i,int j):a(i),b(j)
再比如這個例子:
#include "stdafx.h"
#includeusing namespace std;
class a
~a() };
class b1:public a
~b1() };
int _tmain(int argc, _tchar* argv)
這個列子就會出現編譯錯誤,錯誤如下:原因是例項化子類時候先呼叫父類建構函式再呼叫子類建構函式,如果在子類建構函式裡面初始化父類會導致父類建構函式被呼叫兩次。
請問那句後面的 :a(b) 代表什麼啊,為什麼要跟個b1基類的建構函式?
答:a(b)實際上是做的是用b初始化a的成員x;既x=b; :是初始化列表方式,具體見
正規表示式 問號 冒號 使用
pattern 是非捕獲型括號 匹配pattern,但不捕獲匹配結果。pattern 是捕獲型括號。匹配pattern,匹配pattern並捕獲結果,自動獲取組號 pattern 匹配pattern,匹配pattern並捕獲結果,設定name為組名 使用小括號指定乙個子表示式後,匹配這個子表示式的文...
lambda表示式新特性 雙冒號使用
jdk8新特性 這裡是我在資料庫查詢的使用者實體類結果 list users userdao.selectuser 業務需求,加入我需要迴圈獲取查詢結果的使用者姓名集合結果,按之前的方法我們會用for迴圈這樣寫 list names newarraylist for user user users ...
C 中綴表示式轉字尾表示式
一 中綴表示轉字尾表示的規則 1.遇到操作符時,如果該操作符優先順序高於op stack棧頂的操作符,則直接壓入op stack,如果同級或低於棧頂操作符,則將棧中操作符依次彈出 同時壓入輸出棧 直到遇到比當前操作符優先順序低的,或者遇到了 2.和 都不能進入輸出棧。3.對於操作符 只有 才能將其彈...