C++成员初始化列表

Yes*_*man 26 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();
};
Run Code Online (Sandbox Code Playgroud)

我正在初始化m_size对象创建,因为const.我该如何编写构造函数?我应该重复: m_size(5), m_top(-1),还是我可以省略这一步?

Example::Example( int size, int grow_by)
{
... some code here
}
Run Code Online (Sandbox Code Playgroud)

要么

Example::Example( int size, int grow_by) : m_size(5), m_top(-1)
{
... some code here
}
Run Code Online (Sandbox Code Playgroud)

BHS*_*BHS 58

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

不要求初始化列表位于源(.cpp)或头(.h)文件中. 实际上,编译器不区分这两种类型的文件.重要的区别在于构造函数的声明和它的定义.初始化列表与定义一致,而不是声明.
通常,声明在头文件中,定义在源文件中,但是,这不是语言的要求(即它将编译).当构造函数为空或短时,在类声明中内联提供构造函数定义并不罕见.在这种情况下,初始化列表将进入类声明,这可能在头文件中.

MyClass.h

class MyClass
{
public:
    MyClass(int value) : m_value(value)
    {}
private:
    int m_value;
};
Run Code Online (Sandbox Code Playgroud)


BЈо*_*вић 23

这是初始化列表:

Example::Example( int size, int grow_by) : m_size(5), m_top(-1)
{
... some code here
}
Run Code Online (Sandbox Code Playgroud)

它应该只在cpp文件中完成.

如果您在示例中的标题中执行此操作时,是否收到错误?


Alo*_*ave 13

成员初始化列表是源文件中定义的一部分.
在cpp文件中写这个:

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

}
Run Code Online (Sandbox Code Playgroud)

头文件应该只有:

Example ( int size, int grow_by = 1 );
Run Code Online (Sandbox Code Playgroud)

头文件只声明构造函数,Member Initializer列表不是声明的一部分.


Aru*_*nmu 9

添加到其他答案,关于初始化列表应该记住的最重要的事情是, 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(){}
};

如果一个人不知道上述情况,可能会造成非常严重的影响.