为什么必须在构造函数初始化程序中初始化const成员,而不是在其主体中初始化?
问题描述:
为什么声明为const
的类成员必须在构造函数初始化程序列表中初始化,而不是在构造函数体中初始化?为什么必须在构造函数初始化程序中初始化const成员,而不是在其主体中初始化?
两者有什么区别?
答
在C++中,当执行进入构造函数的主体时,对象被认为是完全初始化的。
你说:
“我想知道为什么常量必须 在构造函数初始化intialized 列表,而不是在它的身上?”。
你缺少什么是初始化发生在初始化列表,分配发生在构造函数体。逻辑步骤:
1)const对象只能被初始化。
2)对象的所有成员都在初始化列表中初始化。即使你没有在那里明确地初始化它们,编译器也会很乐意为你做这件事:-)
3)因此,把1)和2)放在一起,一个const成员只能赋值给它在初始化时发生,这在初始化列表中发生。
答
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++提供了另一种初始化成员变量的方法,它允许在创建成员变量时进行初始化,而不是在之后进行。这是通过使用初始化列表完成的。
您可以通过两种方式为变量赋值:显式隐含: view plaincopy to clipboardprint?
int nValue = 5; // explicit assignment
double dValue(4.7); // implicit assignment
使用初始化列表与进行隐式赋值非常相似。
请记住,用于初始化基本和成员数据对象的成员初始化列表位于定义中,而不是构造函数的声明。
答
由于常量变量和引用必须在声明时(即在使用之前)初始化。 但构造函数将值分配给一个varaible不initailize变量,因此您必须使用initailizier列表常数和引用
恭喜你的第一个答案......^_^ – paercebal 2008-12-10 09:29:21