为你的c++对象构造函数显式地拥有一个完整的初始化列表有什么优点或缺点吗?(完整的意思是你列出了所有的成员,即使我们只是使用默认构造函数?)
例如,如果我有对象:
class MyObject
{
public:
MyObject();
private:
double _doub;
Foo _foo;
std::set<int> _intSet;
int _int;
Bar _bar;
}
和构造函数
有什么区别吗?MyObject::MyObject():
_doub(1.4), _foo("me"), _intSet(),
_int(5), _bar() {};
与只列出我特别需要在其上设置数据(或调用非默认构造函数)的对象:
MyObject::MyObject():
_doub(1.4), _foo("me"), _int(5) {};
如果类只有它使用默认构造函数的对象,我应该设置一个初始化列表吗?
例如:class MyObject
{
public:
MyObject();
private:
Foo _foo;
std::set<int> _intSet;
Bar _bar;
}
有这样一个构造函数的意义吗?
MyObject::MyObject():
_foo(), _intSet(), _bar() {};
谢谢。
()
初始化器对没有用户定义构造函数的对象调用"无构造函数"值初始化。因此,对于这样的对象,构造函数初始化项列表中显式()
初始化项的存在与否是有区别的。
参数可以用于使用()
初始化器("保持所有东西尽可能初始化是好的")和反对它("避免不必要的虚拟初始化")。
就我个人而言,在有或没有()
初始化器的情况下,行为是相同的,我会避免将成员包括到构造函数初始化器列表中。此外,如果行为不同,但我还没有为特定成员提供有意义的初始化器,我宁愿不初始化它(而不是调用值初始化)。
劣势
class A {
public:
A(); //Where A does not initialize members
void initMembers(); //A function that initalizes everything
void tellClassBName(); //Writes a line in the console with the name of b1
private:
B b1;
int aNumber;
}
想象创建一个类a的实例。这个对象不包含b1的值。尽管如此,你仍然可以在调用initMembers()之前调用tellClassBName(),这将导致错误。
如果没有良好的文档,在团队中工作似乎不太好。