为什么const成员必须在构造函数初始化器中初始化,而不是在其本体中初始化?

为什么声明为const类成员必须在构造函数初始化列表中而不是在构造函数体中初始化?

两者有什么区别?

在C ++中,当执行进入构造函数的主体时,对象被认为是完全初始化的。

你说:

“我想知道为什么const必须在构造函数初始化列表中初始化,而不是在它的正文中。”

你所缺less的是初始化发生在初始化列表中,并且赋值在构造函数的主体中发生。 逻辑中的步骤:

1)一个const对象只能被初始化。

2)对象的所有成员都在初始化列表中初始化。 即使你没有明确地初始化它们,编译器也会乐意为你做:-)

3)因此,把1)和2)放在一起,一个const的成员在初始化过程中只能赋值给它,这在初始化列表中发生。

const和引用variables必须在声明的行上初始化。

  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或引用成员variables值是不够的。

C ++提供了另一种初始化成员variables的方法,允许在创build成员variables时进行初始化,而不是在之后进行。 这是通过使用初始化列表完成的。

您可以通过两种方式将值分配给variables:显式隐式地赋值给variables:view plaincopy to clipboardprint?

 int nValue = 5; // explicit assignment double dValue(4.7); // implicit assignment 

使用初始化列表与隐式赋值非常相似。

请记住,用于初始化基本和成员数据对象的成员初始化列表位于定义中,而不是构造函数的声明。

更多关于cpp-tutorial和Code Wrangler的信息 。

因为常量variables和引用必须在声明时即在使用之前初始化。 但是构造函数将赋值给一个variables而不是初始化这个variables,所以你必须使用initailizier列表来获取常量和引用