为什么必须声明类成员const
在构造函数初始化列表中而不是在构造函数体中初始化?
两者有什么区别?
在C++中,当执行进入构造函数体时,会认为对象已完全初始化.
你说:
"我想知道为什么const必须在构造函数初始化列表中而不是在它的正文中初始化?"
你缺少的是初始化发生在初始化列表中,并且赋值发生在构造函数的主体中.逻辑中的步骤:
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++提供了另一种初始化成员变量的方法,允许在创建成员变量时而不是之后初始化成员变量.这是通过使用初始化列表完成的.
您可以通过两种方式为变量赋值:显式和隐式:查看plaincopy到clipboardprint?
int nValue = 5; // explicit assignment double dValue(4.7); // implicit assignment
使用初始化列表与执行隐式赋值非常相似.
请记住,用于初始化基础和成员数据对象的成员初始化列表位于定义中,而不是构造函数的声明.
有关cpp-tutorial和Code Wrangler的更多信息.