C++ 成員初始化列表


——調用構造函數時,對象將在括號中的代碼執行前被創建,因此無法在括號內初始化對象的常量成員。

Queue::Queue(int qs)
{
    front = rear = NULL;
    items = 0;
    qsize =qs;    // not acceptable! qsize是一個常量成員
}

因此C++提供了一種特殊的語法來完成上述工作——成員初始化列表

它是什么樣子:

  • 由逗號分隔的初始化列表組成(前面帶冒號)。
  • 位於參數列表的右括號之后、函數體左括號之前。
  • 如果數據成員的名稱為mdata,並需要將它初始化為val,則初始化器為mdata(val)。
    1 Queue::Queue(int qs) : qsize(qs), items(0) // initialize qsize to qs, 0 to items
    2 {
    3     front = rear = NULL;
    4 } 

     初值可以是常量或構造函數的參數列表中的參數,並且初始化並不只限定用於常量

何時使用:

  • 只有構造函數可以使用種初始化列表語法,不能將成員初始化列表用於構造函數之外的其它類方法
  • 對於本身就是類對象的成員來說,使用成員初始化列表的效率更高(直接調用復制構造函數或轉換函數,代替了【調用默認構造函數,再使用賦值運算符給目標對象賦值】或【未重新定義賦值運算符時:調用默認構造函數,再調用轉換函數構造臨時對象,最后將臨時對象賦給目標對象】【重新定義賦值運算符后:調用默認構造函數,再使用定義的賦值運算符給目標對象賦值】的步驟)
  • 非靜態const成員必須使用這種語法(在C++11之前)
  • 被聲明為引用的類成員必須使用這種語法

特點

  • 數據成員被初始化的順序於它們出現在類聲明中的順序相同,與初始化器中的排列順序無關
  • 成員初始化列表使用的括號方式也可用於常規初始化
    • 即可將
      int games = 162;
      double talk = 2.17828;

       替換為

      int games(162);
      double talk(2.17828);

C++11:

——C++11允許以更直觀的方式進行初始化(非靜態const成員,非靜態成員):

class Classy
{
    int mem1 = 10;    // in-class initialization
    const int mem2 = 20;    // in-class initialization
    ...
};

  如果調用了使用成員初始化列表的構造函數,在這種情況下,實際列表將覆蓋這些默認初始值

 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM