【发布时间】:2010-09-26 04:43:44
【问题描述】:
为什么声明为const 的类成员必须在构造函数初始化列表而不是构造函数体中初始化?
两者有什么区别?
【问题讨论】:
标签: c++ constructor initialization constants
为什么声明为const 的类成员必须在构造函数初始化列表而不是构造函数体中初始化?
两者有什么区别?
【问题讨论】:
标签: c++ constructor initialization constants
因为常量变量和引用必须在声明时即使用前进行初始化。 但是构造函数会将值分配给变量而不是初始化变量,因此您必须使用 initailizier 列表来获取常量和引用
【讨论】:
在 C++ 中,当执行进入构造函数的主体时,对象被认为已完全初始化。
你说:
"我想知道为什么 const 必须是 在构造函数初始化器中初始化 列表而不是正文?”
您缺少的是 initialisation 发生在初始化列表中,而 assignment 发生在构造函数的主体中。逻辑步骤:
1) 一个 const 对象只能被初始化。
2) 一个对象的所有成员都在初始化列表中初始化。即使您没有在此处显式初始化它们,编译器也会很乐意为您这样做:-)
3) 因此,将 1) 和 2) 放在一起,const 成员只能在初始化时分配一个值,这发生在初始化列表期间。
【讨论】:
0(在许多其他编程语言中是的情况)。
const 和引用变量必须在声明它们的行初始化。
class Something
{
private:
const int m_nValue;
public:
Something()
{
m_nValue = 5;
}
};
会产生相当于;
const int nValue; // error, const vars must be assigned values immediately
nValue = 5;
在构造函数的主体中分配 const 或引用成员变量值是不够的。
C++ 提供了另一种初始化成员变量的方法,允许在创建成员变量时而不是之后初始化成员变量。这是通过使用初始化列表来完成的。
您可以通过两种方式为变量赋值:显式和隐式: 将纯副本查看到剪贴板打印?
int nValue = 5; // explicit assignment
double dValue(4.7); // implicit assignment
使用初始化列表与进行隐式赋值非常相似。
请记住,用于初始化基数据对象和成员数据对象的成员初始化列表在定义中,而不是在构造函数的声明中。
更多关于cpp-tutorial 和Code Wrangler。
【讨论】: