构造函数中参数和成员变量的用法

Luk*_*kas 7 c++ code-design

在编写类的构造函数时,我经常会问自己是否应该使用初始化成员变量或构造函数参数.这里有两个例子来说明我的意思:

构造函数参数

class Foo {
public:
    Foo(int speed) :
        mSpeed(speed),
        mEntity(speed)
    { }

private:
    int mSpeed;
    Entity mEntity;
}
Run Code Online (Sandbox Code Playgroud)

成员变量

class Foo {
public:
    Foo(int speed) :
        mSpeed(speed),
        mEntity(mSpeed)
    { }

private:
    int mSpeed;
    Entity mEntity;
}
Run Code Online (Sandbox Code Playgroud)

更进一步,在构造函数体中使用变量会产生同样的问题.

构造函数参数

class Foo {
public:
    Foo(int speed) :
        mSpeed(speed)
    {
        mMonster.setSpeed(speed);
    }

private:
    int mSpeed;
    Monster mMonster;
}
Run Code Online (Sandbox Code Playgroud)

成员变量

class Foo {
public:
    Foo(int speed) :
        mSpeed(speed)
    {
        mMonster.setSpeed(mSpeed);
    }

private:
    int mSpeed;
    Monster mMonster;
}
Run Code Online (Sandbox Code Playgroud)

我知道它并不重要(除了一些特殊情况),这就是为什么我宁愿在代码设计上征求意见,而不是让它起作用,什么不起作用.

如果您需要一个特定的问题可以使用:什么方式可以产生一个漂亮而一致的代码设计,并且一个人具有(dis)优势而不是另一个?

编辑:不要忘记问题的第二部分.构造函数体中的变量怎么样?

mla*_*atu 5

我将使用构造函数参数,因为在使用该初始值设定项时,这些初始值设定项的执行顺序由声明成员的顺序决定,而不是由它们列出的顺序决定。所以,这里要小心。


tak*_*004 3

我个人更喜欢使用构造函数参数,以避免使用尚未初始化的成员变量。

事实上,在这个例子中:

class Foo {
private:
    int mEntity;
    int mSpeed;
public:
    Foo(int speed) :
        mSpeed(speed),
        mEntity(mSpeed)
    { }
}
Run Code Online (Sandbox Code Playgroud)

mEntity 的初始化将发生在 mSpeed 的初始化之前(因为它是在之前声明的)。因此,您将使用未初始化的 mSpeed 来初始化 mEntity。

--

在构造函数主体本身内部,我还会使用构造函数参数,因为在调试时看到使用speed来初始化mMonster而不是mSpeed(它本身是用speed初始化的)会更简单一些。当然,这是一个极简的开销,但由于我们可以轻松避免它,所以我认为这样做更好。