69

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

两者有什么区别?

4

3 回答 3

100

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

你说:

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

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

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

2) 一个对象的所有成员都在初始化列表中初始化。即使您没有在那里显式初始化它们,编译器也会很乐意为您这样做:-)

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

于 2008-12-10T07:01:22.537 回答
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++ 提供了另一种初始化成员变量的方法,允许在创建成员变量时而不是之后初始化成员变量。这是通过使用初始化列表来完成的。

您可以通过两种方式为变量赋值:显式和隐式:查看纯副本到剪贴板打印?

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

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

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

更多关于cpp-tutorialCode Wrangler的信息。

于 2008-12-10T06:57:16.553 回答
-2

因为常量变量和引用必须在声明时即使用前进行初始化。但是构造函数会将值分配给变量而不是初始化变量,因此您必须使用 initailizier 列表来获取常量和引用

于 2016-08-12T09:05:28.203 回答