一千萬個為什麽

搜索

C ++,構造函數後的冒號是什麽意思?

Possible Duplicates:
Variables After the Colon in a Constructor
C++ constructor syntax question (noob)

我這裏有一些C ++代碼:

class demo 
{
private:
    unsigned char len, *dat;

public:
    demo(unsigned char le = 5, unsigned char default) : len(le) 
    { 
        dat = new char[len];                                      
        for (int i = 0; i <= le; i++)                             
            dat[i] = default;
    }

    void ~demo(void) 
    {                                            
        delete [] *dat;                                           
    }
};

class newdemo : public demo 
{
private:
    int *dat1;

public:
    newdemo(void) : demo(0, 0)
    {
     *dat1 = 0;                                                   
     return 0;                                                    
    }
};

我的問題是,什麽是:len(le):demo(0,0)

它與繼承有關嗎?

最佳答案

正如其他人所說,這是一個初始化列表。您可以將它用於兩件事:

  1. 調用基類構造函數
  2. 在構造函數體執行之前初始化成員變量。

對於案例#1,我假設您了解繼承(如果不是這種情況,請在評論中告訴我)。所以你只是調用基類的構造函數。

對於案例#2,可能會問:“為什麽不在構造函數的主體中初始化它?”初始化列表的重要性對於 const 成員尤為明顯。例如,看看這種情況,我想根據構造函數參數初始化 m_val

class Demo
{
    Demo(int& val) 
     {
         m_val = val;
     }
private:
    const int& m_val;
};

根據C ++規範,這是非法的。我們不能在構造函數中更改 const 變量的值,因為它被標記為const。所以你可以使用初始化列表:

class Demo
{
    Demo(int& val) : m_val(val)
     {
     }
private:
    const int& m_val;
};

這是您唯一可以更改const成員變量的時間。正如Michael在評論部分中指出的那樣,它也是初始化作為類成員的引用的唯一方法。

除了使用它來初始化 const 成員變量之外,它似乎已被普遍認為是初始化變量的“方式”,因此其他程序員可以清楚地閱讀您的代碼。

轉載註明原文: C ++,構造函數後的冒號是什麽意思?