可能重复:
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)
被称为什么?
它与继承有关吗?
答案 0 :(得分:239)
正如其他人所说,这是一个初始化列表。您可以将它用于两件事:
对于案例#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
成员变量之外,它似乎已被普遍认为是初始化变量的“方式”,因此其他程序员可以清楚地阅读您的代码。
答案 1 :(得分:24)
这称为初始化列表。它用于将参数传递给父类的构造函数。这是一个解释它的好链接:Initialization Lists in C++
答案 2 :(得分:6)
它被称为初始化列表。它在构造函数体执行之前初始化成员。
答案 3 :(得分:6)
它被称为初始化列表。初始化列表是如何将参数传递给成员变量的构造函数以及如何将参数传递给父类的构造函数。
如果在构造函数体中使用=
进行赋值,则首先调用默认构造函数,然后调用赋值运算符。这有点浪费,有时没有等效的赋值操作符。
答案 4 :(得分:2)
这意味着未使用默认构造函数设置len
。正在构建demo
类。例如:
class Demo{
int foo;
public:
Demo(){ foo = 1;}
};
在将foo设置为1之前,首先会在foo中放置一个值。它会更快更有效。
答案 5 :(得分:1)
您正在调用其基类的构造函数demo。