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

Avi*_*ano 1 c++

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

class Person {
public:
    Person(string personId);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ker*_* SB 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
    }

    // ...

};
Run Code Online (Sandbox Code Playgroud)

如您所见,初始化不仅仅是一种噱头; 相反,它是C++类型系统的深刻必要性:有许多变量必须初始化并且不能分配给它们,例如常量和引用,还有没有默认构造函数的用户定义类型.(即使有默认的构造函数,那么你需要一个赋值操作符,它在任何情况下仍然是浪费构建你不想要的东西只是片刻之后覆盖它.)

还要注意构造类成分的顺序:当您创建类的新实例时,首先构造成员对象,按照它们在类定义中声明的顺序,但是按照在初始化列表.构造完所有成员后,构造函数的主体就会运行.

实际上,甚至在成员对象之前还有另外一个构造: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
    }

    // ...
};
Run Code Online (Sandbox Code Playgroud)

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