4

为您的 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() {};

谢谢。

4

2 回答 2

7

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

可以为使用()初始化程序(“尽可能保持一切初始化”)和反对它(“避免无偿的虚拟初始化”)提出论据。

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

于 2013-01-04T20:52:51.747 回答
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(),这将导致错误。

在团队工作时,如果没有良好的文档,这似乎不是很好。

于 2013-01-04T20:56:37.160 回答