C++,构造函数后的冒号是什么意思?

标签 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++,构造函数后的冒号是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2785612/

相关文章:

c++ - 使用虚拟方法纠正行为

c++ - 在 Visual Studio 中将单精度浮点与 FFTW 结合使用

c++ - std::decay 和 std::remove_cvref 之间的区别?

c++ - gcc 何时编译未使用的模板代码?

c++ - 为什么在类模板的显式实例化之前需要外部类模板的显式实例化

c++ - 尝试编译着色器时获取 0 :1(1): error: syntax error, 意外的 $end

c++ - C++ 中的 << 运算符在做什么?

c++ - 什么 C/C++ 库用于 HTML DOM 构建/更改?

c++ - 如何从派生类调用重载的父 cout 友元类?

c++模板特化 - 链接器错误多个定义