C ++成员初始化列表

请解释如何使用成员初始化列表。 我有一个.h文件和.cpp文件中声明的类,如下所示:

 class Example { private: int m_top; const int m_size; ... public: Example ( int size, int grow_by = 1 ) : m_size(5), m_top(-1); ... ~Example(); }; 

我正在初始化由于const对象创buildm_size 。 我应该如何编写构造函数? 我应该重复: m_size(5), m_top(-1) ,或者我可以省略这一步?

 Example::Example( int size, int grow_by) { ... some code here } 

要么

 Example::Example( int size, int grow_by) : m_size(5), m_top(-1) { ... some code here } 

这是初始化列表:

 Example::Example( int size, int grow_by) : m_size(5), m_top(-1) { ... some code here } 

它只能在cpp文件中完成。

当你像在你的例子中的标题中那样做的时候,你没有得到一个错误吗?

只是为了澄清一些其他答案中出现的问题

不要求初始化列表位于源文件(.cpp)或头文件(.h)中。 实际上,编译器并不区分这两种types的文件。 重要的区别在于构造者的声明和它的定义之间。 初始化列表与定义一起使用,而不是声明。
通常,声明是在一个头文件中,并且定义在一个源文件中,然而,这不是该语言的要求(即它将被编译)。 当构造函数为空或者空时,在类声明中内联构造函数定义并不less见。 在这种情况下,初始化列表将进入类声明中,这可能会在头文件中。

MyClass.h

 class MyClass { public: MyClass(int value) : m_value(value) {} private: int m_value; }; 

成员初始化程序列表是源文件中定义的一部分。
写在cpp文件中:

 Example ( int size, int grow_by) : m_size(5), m_top(-1) { } 

头文件应该只有:

 Example ( int size, int grow_by = 1 ); 

头文件只声明构造函数,成员初始化器列表不是声明的一部分。

添加到其他人的答案中,关于初始化列表应该记住的最重要的事情是, the order of initialization is decided in the order in which the data members are declared, not the the order in which you have initialized the data members using initialization list

考虑一下这个例子(你的):

class Example { private: int m_top; const int m_size; ... public: Example ( int size, int grow_by = 1 ) : m_size(5), m_top(-1){} /* Though size is initialized with a value first But it is m_top variable that is assigned value -1 before m_size is assigned value 5 */ ... ~Example(){} };
class Example { private: int m_top; const int m_size; ... public: Example ( int size, int grow_by = 1 ) : m_size(5), m_top(-1){} /* Though size is initialized with a value first But it is m_top variable that is assigned value -1 before m_size is assigned value 5 */ ... ~Example(){} }; 

如果不知道上述情况,可能会造成非常严重的后果。

在C ++ 11中,您可以使用非静态数据成员初始化 。 如果你有几个需要成员variables的公共值的构造函数,这个特别有用。

 class Example { private: int m_top = -1; const int m_size = 5; ... public: Example ( int size, int grow_by = 1 ); ... ~Example(); }; ... Example::Example( int size, int grow_by ) { ... some code here } 

如果需要,可以在构造函数中覆盖该值。

您不能在头文件和cpp中都有初始化列表。 该列表应该在哪个文件中定义您的构造函数。 你也必须包含一个构造函数体,即使它是空的。

在旁注中,只应该在函数原型中指定默认参数,而不是在定义中。