1. 程式人生 > >C++建構函式後面的冒號

C++建構函式後面的冒號

建構函式後加冒號是初始化表示式:
有四種情況下應該使用初始化表示式來初始化成員:
1:初始化const成員
2:初始化引用成員
3:當呼叫基類的建構函式,而它擁有一組引數時

4:當呼叫成員類的建構函式,而它擁有一組引數時。

在程式中定義變數並初始化的機制中,有兩種形式,一個是我們傳統的初始化的形式,即賦值運算子賦值,還有一種是括號賦值,如:
   int a=10;
   char b='r';//賦值運算子賦值
  int a(10);/
   char b('r');//括號賦值
以上定義並初始化的形式是正確的,可以通過編譯,但括號賦值只能在變數定義並初始化中,不能用在變數定義後再賦值,

冒號初始化是給資料成員分配記憶體空間時就進行初始化,就是說分配一個數據成員只要冒號後有此資料成員的賦值表示式(此表示式必須是括號賦值表示式),那麼分配了記憶體空間後在進入函式體之前給資料成員賦值,就是說初始化這個資料成員此時函式體還未執行。 對於在函式中初始化,是在所有的資料成員被分配記憶體空間後才進行的。    這樣是有好處的,有的資料成員需要在建構函式調入之後函式體執行之前就進行初始化如引用資料成員,常量資料成員和物件資料成員,

class student
   {public :

     student ()
      .
      .
      .
     protected:
     const int a;
     int &b;

   }

   student ::student (int i,int j)
  {
     a=i;
     b=j;
   } 
在Student類中有兩個資料成員,一個是常量資料成員,一個是引用資料成員,並且在建構函式中初始化了這兩個資料成員,但是這並不能通過編譯,因為常量初始化時必須賦值,它的值是不能再改變的,與常量一樣引用初始化也需要賦值,定義了引用後,它就和引用的目標維繫在了一起,也是不能再被賦值的。所以C
++":"後初始化的機制,使引用和常量資料成員變為可能的,Student類的建構函式應為:  student ::student(int i,int j):a(i),b(j){}