c++建構函式後面的冒號
初始化列表,跟在{}裡面的初始化沒有什麼不同,
但在非靜態const型別以及引用型成員變數必須在初始化列表裡面初始化,不能在{}裡面初始化
.a(b)就是用父類的建構函式進行一部分初始化.
--------------
很多的人對中建構函式寢初始化很多的困惑,對冒號後初始化不是太明白,總搞不清楚它們之間的區別,我想把我對這個問題的理解和看法和大家討論討論。
在程式中定義變數並初始化的機制中,有兩種形式,乙個是我們傳統的初始化的形式,即賦值運算子賦值,還有一種是括號賦值,如:
int a=10;
char b='r';\\賦值運算子賦值
int a(10);\
char b('r');\\括號賦值
以上定義並初始化的形式是正確的,可以通過編譯,但括號賦值只能在變數定義並初始化中,不能用在變數定義後再賦值,這是和賦值運算子賦值的不同之處,如:
(1)int a; \\先定義乙個變數
......
a=10; \\根據需要賦值
(2)int b; \\先定義乙個變數
......
b(10); \\和(1)一樣根據需要賦值
(1)是可以用通過編譯,定義乙個變數a但並沒有初始化,在需要變數a的時候,通過賦值運算子把10賦給a,而在(2)中,是通過括號把10賦值給b,但編譯系統認為
這是乙個函式的呼叫,函式名為b,10為實際引數,所以編譯錯誤。因此,括號賦值只用在定義變數並初始化中。
現在我們來看建構函式中冒號初始化和函式初始化的問題,類建構函式的作用是建立乙個類的物件時,呼叫它來構造這個類物件的資料成員,一要給出此資料成員分配記憶體空間,二是要給函式資料成員初始化,構造資料成員是按資料成員在類中宣告的順序進行構造。
冒號初始化與函式體初始化的區別在於:
冒號初始化是給資料成員分配記憶體空間時就進行初始化,就是說分配乙個資料成員只要冒號後有此資料成員的賦值表示式(此表示式必須是括號賦值表示式),那麼分配了記憶體空間後在進入函式體之前給資料成員賦值,就是說初始化這個資料成員此時函式體還未執行。
對於在函式中初始化,是在所有的資料成員被分配記憶體空間後才進行的。
這樣是有好處的,有的資料成員需要在建構函式調入之後函式體執行之前就進行初始化如引用資料成員,常量資料成員和物件資料成員,看下面的一段程式:
class student
student ::student (int i,int j)
在student類中有兩個資料成員,乙個是常量資料成員,乙個是引用資料成員,並且在建構函式中初始化了這兩個資料成員,但是這並不能通過編譯,因為常量初始化時必須賦值,它的值是不能再改變的,與常量一樣引用初始化也需要賦值,定義了引用後,它就和引用的目標維繫在了一起,也是不能再被賦值的。所以c ++":"後初始化的機制,使引用和常量資料成員變為可能的,student類的建構函式應為:
student ::student(int i,int j):a(i),b(j){}
在下面的程式:
class teach
teach ::teach(char*p,int a)
class student
; student::student(char *p)
在上面的程式中通不過編譯,編譯系統會告訴你teacher這個類物件缺預設建構函式,因為在teach 類中沒有定義預設的建構函式。那麼帶引數的建構函式怎麼進行構造呢?通過我們前面提到的冒號賦值。那它的建構函式應該是:
student::student(char *p,char *pl,int ag):teacher(pl,ag)
就是說在沒有預設建構函式的時候,如果乙個類物件是另乙個類的資料成員,那麼初始化這個資料成員,就應該放到冒號後面。這樣可以帶引數。在類的定義中,如:
protected;
char name[30];
teach teacher
類物件是不能帶引數的,因為它只是宣告。
所以在c++中就增加了這種機制,這是物件導向程式設計所必須的。不知道我講明白沒有。如不明白請查閱有關資料
(C )建構函式初始化
vc 中的對於類的定義是有很大的不同。例如在.net程式中對於需要初始化的引數可以直接的賦值,而在vc 中對於需要初始化的引數則需要使用不同的方法。例如對於char字元則需要使用strcpy s函式賦值而相反對於布林型別 bool 整數型別 int 則可以使用運算子 對其初始化。1.定義乙個帶有引數...
C 建構函式初始化
建構函式後面增加冒號一般有三種作用 1 對成員變數的初始化 2 對類成員物件初始化 3 對父類進行初始化 include include using namespace std class a int get key int main 答案 class a 類物件初始化 int get key in...
C 中的建構函式 初始化
初始化 兩種形式,或者在函式體裡初始化。class 張三 protected int 飯量 const int 智商 int 小名 你需要知道的知識 int 為引用變數,需要在定義的時候初始化.const為恒量限定符,需要在定義的時候初始化,且const建立之後不允許再次賦值 本 由於上述原因而編譯...