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

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

问题描述:

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

两者有什么区别?

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

你说:

“我想知道为什么常量必须 在构造函数初始化intialized 列表,而不是在它的身上?”。

你缺少什么是初始化发生在初始化列表,分配发生在构造函数体。逻辑步骤:

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

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

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

+3

恭喜你的第一个答案......^_^ – paercebal 2008-12-10 09:29:21

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++提供了另一种初始化成员变量的方法,它允许在创建成员变量时进行初始化,而不是在之后进行。这是通过使用初始化列表完成的。

您可以通过两种方式为变量赋值:显式隐含: view plaincopy to clipboardprint?

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

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

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

更多关于cpp-tutorialCode Wrangler

由于常量变量和引用必须在声明时(即在使用之前)初始化。 但构造函数将值分配给一个varaible不initailize变量,因此您必须使用initailizier列表常数和引用