在编写类的构造函数时,我经常会问自己是否应该使用初始化成员变量或构造函数参数.这里有两个例子来说明我的意思:
构造函数参数
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)优势而不是另一个?
编辑:不要忘记问题的第二部分.构造函数体中的变量怎么样?
我个人更喜欢使用构造函数参数,以避免使用尚未初始化的成员变量。
事实上,在这个例子中:
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初始化的)会更简单一些。当然,这是一个极简的开销,但由于我们可以轻松避免它,所以我认为这样做更好。