2012-09-18 33 views
1
class Monitor { 
public: 
    Monitor(string someData); 
    Person person_; 
} 

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

人没有默认的构造函数。它有一个参数构造函数。 我只能初始化监视器构造函数。 我来自java的声明只是指针,所以你不需要在声明时初始化新的实例。c + +我可以声明类成员,并在构造函数中初始化它

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

回答

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++类型系统的一个深刻的必要性:有很多变量,其中必须被初始化并且不能被赋值,比如常量和引用,还有用户定义的类型,没有默认构造函数。 (即使有默认构造函数,那么你需要一个赋值操作符,它在任何情况下仍然是浪费构建你不想要的东西只是覆盖它片刻之后。)

收费还要注意类组成部分的构建顺序:创建类的新实例时,首先按照在类定义中声明它们的顺序构造成员对象,但按照初始化程序列表。在构建所有成员之后,运行构造函数的正文

实际上,还有一件事是在成员对象之前构建的:base子对象。当然,他们的初始太无二在初始化列表中:

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 
    } 

    // ... 
}; 

强烈建议(虽然不是强制),你写在构造函数初始化列表中初始化中,他们将执行相同的顺序!

+0

我只能在Monitor构造函数中初始化它。 –

+0

@ user1495181:做一个辅助函数,就像我为'n'做的那样! –

相关问题