很多的人對中建構函式寢初始化很多的困惑,對冒號後初始化不是太明白,總搞不清楚它們之間的區別,我想把我對這個問題的理解和看法和大家討論討論。
在程式中定義變數並初始化的機制中,有兩種形式,一個是我們傳統的初始化的形式,即賦值運算子賦值,還有一種是括弧賦值,如:
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為實際參數,所以編譯錯誤。因此,括弧賦值只用在定義變數並初始化中。
網管下載dl.bitscn.com
現在我們來看建構函式中冒號初始化和函數初始化的問題,類建構函式的作用是建立一個類的對象時,調用它來構造這個類對象的資料成員,一要給出此資料成員分配記憶體空間,二是要給函數資料成員初始化,構造資料成員是按資料成員在類中聲明的順序進行構造。
冒號初始化與函數體初始化的區別在於:
冒號初始化是給資料成員分配記憶體空間時就進行初始化,就是說分配一個資料成員只要冒號後有此資料成員的賦值運算式(此運算式必須是括弧賦值運算式),那麼分配了記憶體空間後在進入函數體之前給資料成員賦值,就是說初始化這個資料成員此時函數體還未執行。
對於在函數中初始化,是在所有的資料成員被分配記憶體空間後才進行的。
這樣是有好處的,有的資料成員需要在建構函式調入之後函數體執行之前就進行初始化如引用資料成員,常量資料成員和對象資料成員,看下面的一段程式:
class student
{public :
student ()
.
.
.
protected:
const int a;
int &b;
中國網管聯盟bitsCN.com
}
student ::student (int i,int j)
{
a=i;
b=j;
}
在Student類中有兩個資料成員,一個是常量資料成員,一個是引用資料成員,並且在建構函式中初始化了這兩個資料成員,但是這並不能通過編譯,因為常量初始化時必須賦值,它的值是不能再改變的,與常量一樣引用初始化也需要賦值,定義了引用後,它就和引用的目標維繫在了一起,也是不能再被賦值的。所以C
++":"後初始化的機制,使引用和常量資料成員變為可能的,Student類的建構函式應為:
student ::student(int i,int j):a(i),b(j){}
在下面的程式:
class teach
{
public :
teach(char *p="name",int a=0)
.
.
.
protected:
char name[30];
int age;
}
teach ::teach(char*p,int a)
{
strcopy(name ,p);
age=a; 網管論壇bbs_bitsCN_com
cout>>name>>endl;
}
class student
{
public:
student (char *p="name");
.
.
.
protected;
char name[30];
teach teacher;
};
student::student(char *p)
{
strcopy(name,p);
cont>>name>>endl;
}
在上面的程式中通不過編譯,編譯系統會告訴你teacher這個類對象缺預設建構函式,因為在teach 類中沒有定義預設的建構函式。那麼帶參數的建構函式怎麼進行構造呢?通過我們前面提到的冒號賦值。那它的建構函式應該是:
student::student(char *p,char *pl,int ag):teacher(pl,ag)
{
strcopy(name,p);
cont>>name>>endl;
}
就是說在沒有預設建構函式的時候,如果一個類對象是另一個類的資料成員,那麼初始化這個資料成員,就應該放到冒號後面。這樣可以帶參數。在類的定義中,如:
網管bitscn_com
protected;
char name[30];
teach teacher
類對象是不能帶參數的,因為它只是聲明。
所以在C++中就增加了這種機制,這是物件導向編程所必須的。不知道我講明白沒有。如不明白請查閱有關資料。
ref:http://blog.csdn.net/yiyunoo/article/details/2452363