具有多个构造函数的C++ init成员变量

Die*_*wer 4 c++

通常构造函数应如下所示:

//ctor1
SmallSim::SmallSim()
:mSimInit(false)
,mServersCreated(false)
,mTotalCPUTime(0)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我有多个构造函数会发生什么?

它在我看来,如果我从第二个调用第一个构造函数,第一个构件变量就不会被初始化.

//ctor2
SmallSim::SmallSim(bool ImmediateExecution, bool Report)
{
    SmallSim();

    ...
}
Run Code Online (Sandbox Code Playgroud)

那么我需要在每个构造函数上重复:mSimInit(false),mServersCreated(false),mTotalCPUTime(0)吗?

据我所知使用InitClassVars()不是最好的方法...

//ctor1
SmallSim::SmallSim()
{
    InitClassVars();

    ...
}

//ctor2
SmallSim::SmallSim(bool ImmediateExecution, bool Report)
{
    InitClassVars();

    ...
}

//Common function for init of member vars for multiple constructors
void SmallSim::InitClassVars(void)
{
    mSimInit = false;
    mServersCreated = false;
    mTotalCPUTime = 0;
}
Run Code Online (Sandbox Code Playgroud)

是否有正确的方法来初始化成员变量而不在每个构造函数上重复init?

R. *_*des 10

如果你这样做:

SmallSim::SmallSim(bool ImmediateExecution, bool Report)
{
    SmallSim(); // 1

    ...
}
Run Code Online (Sandbox Code Playgroud)

标有1的行创建了一个新的SmallSim临时对象,由于未使用它,因此很容易被破坏.它对当前正在初始化的对象没有任何影响.要在同一个对象上调用另一个构造函数,您可以这样做:

SmallSim::SmallSim(bool ImmediateExecution, bool Report)
: SmallSim() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

(这是C++ 11的功能.)

  • @DieSlower可能你的编译器还不支持委托构造函数.AFAIK,至少需要GCC 4.7或Clang 3.0. (4认同)

dir*_*tly 6

C++ 03中有两个选项:

  • 使用从每个ctor调用的init函数
  • 为所有ctors提供初始化列表

在C++ 11中,您可以使用委托ctors,以便您可以从所有其他人调用一个ctor.