【发布时间】:2014-02-07 11:10:52
【问题描述】:
在编写类的构造函数时,我经常问自己应该使用初始化的成员变量还是构造函数参数。这里有两个例子来说明我的意思:
构造函数参数
class Foo {
public:
Foo(int speed) :
mSpeed(speed),
mEntity(speed)
{ }
private:
int mSpeed;
Entity mEntity;
}
成员变量
class Foo {
public:
Foo(int speed) :
mSpeed(speed),
mEntity(mSpeed)
{ }
private:
int mSpeed;
Entity mEntity;
}
更多在构造函数主体中使用变量也会出现同样的问题。
构造函数参数
class Foo {
public:
Foo(int speed) :
mSpeed(speed)
{
mMonster.setSpeed(speed);
}
private:
int mSpeed;
Monster mMonster;
}
成员变量
class Foo {
public:
Foo(int speed) :
mSpeed(speed)
{
mMonster.setSpeed(mSpeed);
}
private:
int mSpeed;
Monster mMonster;
}
我知道这并不重要(除了一些特殊情况),这就是为什么我宁愿要求 cmets 进行代码设计,而不是什么使它起作用,什么不起作用。
如果您需要处理一个特定问题:哪种方式可以产生良好且一致的代码设计,并且其中一种方式比另一种方式具有(不利)优势?
编辑:不要忘记问题的第二部分。构造函数体中的变量呢?
【问题讨论】:
-
根据经验:最好使用已初始化的成员!
-
ImportantFunction对mSpeed有副作用吗? -
不,它只是一个“随机”函数,不能在初始化列表中调用。
-
有点相关:另外,不要忘记在你的第一个 sn-p 的情况下,这些成员在类中声明的顺序将决定它们的初始化顺序; 不是初始化列表中的顺序。如果
mEntity在非静态成员列表中的mSpeed之前声明,您将有一个不确定的值用作mEntity的初始值设定项,即使初始值设定项列表中的顺序另有说明。 -
@Lukas 如果它与初始化无关,为什么要在构造函数中调用它?它会影响全局变量吗?它会进行初始化后吗?
标签: c++