c ++我可以声明类成员并在构造函数中初始化它

时间:2012-09-18 08:31:05

标签: c++

class Monitor {
public:
    Monitor(string someData);
    Person person_;
}

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

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

没有默认构造函数的类成员的最佳做法是什么? 我应该添加默认构造函数(缺点 - 没用它)或使用指针。

1 个答案:

答案 0 :(得分:7)

是的,您可以通过构造函数初始化列表

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 就会运行。

实际上,甚至在成员对象之前还有另外一个构造:base subobjects。当然,它们的初始化程序也会出现在初始化列表中:

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
    }

    // ...
};

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