在默认构造函数中明确设置初始化列表是有优点还是缺点?

时间:2013-01-04 20:43:24

标签: c++ initialization-list

为C ++对象构造函数显式提供FULL初始化列表是否有任何优点或缺点? (如果您列出了所有成员,即使我们只是使用默认构造函数,那么就完整了吗?)

例如,如果我有对象:

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只有它使用默认构造函数的对象,我是否应该设置初始化列表?

例如:

class MyObject
{
    public: 
        MyObject();

    private:
        Foo _foo;
        std::set<int> _intSet;
        Bar _bar;
}

是否有一个构造函数是这样的?

MyObject::MyObject():
    _foo(), _intSet(), _bar() {};

感谢。

2 个答案:

答案 0 :(得分:7)

()初始化程序为没有用户定义构造函数的对象调用“无需构造”值初始化。因此,对于此类对象,构造函数初始值设定项列表中是否存在显式()初始值设定项会产生差异。

可以使用()初始值设定程序(“尽可能保持所有内容尽可能初始化”)并反对它(“避免无偿虚拟初始化”)。

就个人而言,如果有或没有()初始值设定项的行为相同,我会避免将成员包含在构造函数初始化列表中。此外,如果行为不同但我还没有为特定成员创建有意义的初始化程序,我宁愿保持未初始化(而不是调用值初始化)。

答案 1 :(得分:0)

<强>缺点

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(),这会导致错误。

如果团队合作没有良好的文档,那似乎不太好。