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

可能重复:
在构造函数冒号后的variables
C ++构造函数的语法问题(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)调用?

这与inheritance有关吗?

正如其他人所说,这是一个初始化列表。 你可以用它来做两件事情:

  1. 调用基类的构造函数
  2. 在构造函数的主体执行之前初始化成员variables。

对于案例1,我假设你理解inheritance(如果情况并非如此,请在评论中告诉我)。 所以你只是简单地调用你的基类的构造函数。

对于案例#2,可能会问这个问题:“为什么不只是在构造函数的主体中初始化呢? 初始化列表的重要性对于const成员来说尤其明显。 例如,看看这种情况,我想根据构造函数参数初始化m_val

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

按照C ++规范,这是非法的。 我们不能在构造const改变constvariables的值,因为它被标记为const。 所以你可以使用初始化列表:

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

这是唯一一次你可以改变一个const成员variables。 正如Michael在注释部分提到的,这也是初始化一个类成员引用的唯一方法。

除了使用它来初始化const成员variables之外,它似乎已经被普遍接受为初始化variables的“方式”,所以其他程序员阅读代码时很清楚。

这被称为初始化列表。 它用于将parameter passing给父类的构造函数。 这里有一个很好的链接来解释它: C ++中的初始化列表

它被称为初始化列表。 它在构造函数的主体执行之前初始化成员。

它被称为初始化列表。 初始化器列表是如何将parameter passing给成员variables的构造函数以及如何将parameter passing给父类的构造函数。

如果使用=在构造函数体中赋值,则首先调用默认构造函数,然后调用赋值运算符。 这有点浪费,有时候没有相应的赋值运算符。

您正在调用其基类Demo的构造函数。

这意味着len不是使用默认的构造函数设置的。 而demo课正在构build中。 例如:

 class Demo{ int foo; public: Demo(){ foo = 1;} }; 

在将它设置为1之前,首先将它放在foo中。它稍微快一点,效率更高。