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

时间:2008-12-10 06:35:36

标签: c++ constructor initialization const

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

两者有什么区别?

3 个答案:

答案 0 :(得分:95)

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

你说:

  

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

您缺少的是初始化在初始化列表中发生,赋值发生在构造函数的主体中。逻辑中的步骤:

1)const对象只能初始化。

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

3)因此,将1)和2)放在一起,const的成员只能在初始化时分配给它的值,这在初始化列表中会发生。

答案 1 :(得分:9)

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-tutorialCode Wrangler的详情。

答案 2 :(得分:-2)

因为常数变量和参考必须在声明时,即在使用前初始化。 但是构造函数会将值赋值给变量而不是初始化变量,因此必须使用initailizier列表来表示常量和引用