【问题标题】:c++ can i declare class member and initialized it in the constructor [duplicate]c ++我可以在构造函数中声明类成员并对其进行初始化吗?
【发布时间】:2012-09-18 08:31:05
【问题描述】:
class Monitor {
public:
    Monitor(string someData);
    Person person_;
}

class Person {
public:
    Person(string personId);
}

Person 没有默认构造函数。它有一个参数构造函数。 我只能在 inside Monitor 构造函数中初始化它。 我来自java,声明只是指针,所以声明时不需要初始化新实例。

对于没有默认构造函数的类成员的最佳实践是什么? 我应该添加默认构造函数(缺点 - 没有用)还是使用指针。

【问题讨论】:

    标签: c++


    【解决方案1】:

    是的,你可以,而且你总是应该,通过构造函数初始化列表

    class Monitor
    {
        Person p; 
        bool   state;
        const  int n;
        double & d;
    
        Monitor(std::string const & pname, double & dbl)
        : p(pname)
        , state(false)
        , n(some_other_function(p, state))
        , d(dbl)
        {
             // constructor body should be as short as possible
        }
    
        // ...
    
    };
    

    如您所见,初始化不仅仅是一个噱头;相反,它是 C++ 类型系统的一个深刻的必要性:有很多变量必须被初始化并且不能被赋值,例如常量和引用,还有没有默认构造函数的用户定义类型。 (即使有 个默认构造函数,您也需要一个赋值运算符,而且在任何情况下构造一个您不想稍后再覆盖它的东西仍然是一种浪费。)

    还要注意你的类成分的构造顺序:当你创建你的类的一个新实例时,首先构造成员对象,按照它们在类定义中声明的顺序,但是按照初始化列表中的指定进行初始化。所有成员构造完成后,构造函数的body运行。

    实际上,在成员对象之前还构造了另一件事:基础子对象。自然地,它们的初始化器也在初始化器列表中:

    struct Foo { Foo(int, bool);               /* ... */ };
    struct Bar { Bar(std::string const &, int) /* ... */ };
    
    class Monitor : public Foo, private Bar
    {
        Person p;
    
        Monitor(std::string const & pname, int a, int b)
        : Foo(a, a == b)
        , Bar(pname, b)
        , p(pname)
        {
            // constructor body
        }
    
        // ...
    };
    

    强烈建议(尽管不强制)在构造函数初始化器列表中按照它们的执行顺序编写初始化器!

    【讨论】:

    • 我只能在 Monitor 构造函数中初始化它。
    • @user1495181:创建一个辅助函数,就像我为 n 所做的那样!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多