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,可能会问这样的问题:“为什么不在构造函数的主体中初始化它?”初始化列表的重要性对于 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/