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

mah*_*esh 64 c++ constructor initialization const

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

两者有什么区别?

小智 96

在C++中,当执行进入构造函数体时,会认为对象已完全初始化.

你说:

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

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

1)const对象只能初始化.

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

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

  • 恭喜你的第一个答案...... ^ _ ^ (3认同)
  • 关于2号。ASFAIK 这仅适用于具有默认构造函数的非内置类型。我想说,第一条和你在上面列出的内容一起足以回答这个问题。不管怎样,我的回答很好+1! (2认同)

Von*_*onC 9

const 并且必须在声明它们的行上初始化引用变量.

 class Something  
 {  
     private:  
      const int m_nValue;  
     public:  
      Something()  
      {  
          m_nValue = 5;  
      }  
  };
Run Code Online (Sandbox Code Playgroud)

会产生相当于的代码;

const int nValue; // error, const vars must be assigned values immediately  
nValue = 5; 
Run Code Online (Sandbox Code Playgroud)

在构造函数体中分配const或引用成员变量值是不够的.

C++提供了另一种初始化成员变量的方法,允许在创建成员变量时而不是之后初始化成员变量.这是通过使用初始化列表完成的.

您可以通过两种方式为变量赋值:显式和隐式:查看plaincopy到clipboardprint?

int nValue = 5; // explicit assignment  
double dValue(4.7); // implicit assignment  
Run Code Online (Sandbox Code Playgroud)

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

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

有关cpp-tutorialCode Wrangler的更多信息.