您使用什么方法初始化成员变量?

时间:2015-08-13 18:03:25

标签: c++

假设我有一个类Foo,其成员变量是std::vector浮点数bar。然后我创建一个名为Foo的{​​{1}}实例。假设我在程序运行之前不知道foo的长度,但是在调用bar的构造函数时,我知道它的长度应该是foo。< / p>

我可以通过三种方式来初始化x的长度,我只是想知道三个大多数人中哪一个倾向于使用。我按照我认为是“最佳实践”的顺序对它们进行了排序,但我对人们“实际”在实践中使用的方法更加好奇。有时我使用的方法可以使代码更清晰,而不是必须遵循最佳实践......

  1. bar是私人会员,我在bar构造函数中调整了大小,例如foo's

  2. Foo foo(x){bar.resize(x)};是私人会员,在创建bar后,我致电foo.ResizeBar(x)在内部调整bar。{/ p>

  3. foo是公开会员,我在创建bar后致电foo.bar.resize(x)

  4. 或者,在代码中:

    1

    foo

    2

    class Foo
    {
    private:
        std::vector<float> bar;
    public:
        Foo(int x)
        {
            bar.resize(x);
        };
    };
    
    int main()
    {
        Foo foo(100);
        return 0;
    }
    

    3

    class Foo
    {
    private:
        std::vector<float> bar;
    public:
        Foo()
        {
        };
        void ResizeBar(int x)
        {
            bar.resize(x);
        };
    };
    
    int main()
    {
        Foo foo;
        foo.ResizeBar(100);
        return 0;
    }
    

2 个答案:

答案 0 :(得分:7)

你所有三种方法的问题在于你不必要地为你的向量调用默认初始化器,然后然后修改已经初始化的向量以满足你的需要。

您应该使用初始化列表调用正确的初始值设定项:

Foo::Foo(std::size_t x) : bar(x, 0) { }

答案 1 :(得分:6)

最佳方法不在您发布的选项列表中。最好的方法是使用member initializer lists初始化bar

Foo::Foo(int x) : bar(x) {}