必须在构造函数库/成员中初始化?

时间:2013-03-17 13:10:05

标签: c++ constructor

我有这个:

class SistemPornire
{
Motor& m;
Electromotor& e;
public:
SistemPornire(Motor&,Electromotor&);
}

其中Motor和Electromotor是另外两个类别。我尝试像这样定义这个类的构造函数:

SistemPornire::SistemPornire(Motor& M,Electromotor& E)
{
this->m = M;
this->e = E;
}

但它给了我'SistemPornire :: m':必须在构造函数base / member初始化列表和'SistemPornire :: e'中初始化:必须在构造函数base / member初始化列表中初始化

4 个答案:

答案 0 :(得分:7)

您必须使用initialization lists,因为必须始终在创建时初始化引用:

SistemPornire::SistemPornire(Motor& M,Electromotor& E) : m(M), e(E) { }
//                                                     ^^^^^^^^^^^^

如果不需要,构造函数的主体可以在绑定到对象之前访问这些引用。但是,在C ++中,引用必须始终绑定到对象。

初始化列表中的初始化始终保证在执行构造函数体之前(以及构造所有基类子对象之后)执行。

答案 1 :(得分:0)

必须在成员初始化列表中初始化引用:

SistemPornire::SistemPornire(Motor& M, Electromotor& E) : m(M), e(E) {}

答案 2 :(得分:0)

试试这个:

SistemPornire::SistemPornire(Motor& M,Electromotor& E)
: m(M)
, e(E)
{

}

答案 3 :(得分:0)

初始化列表是一组在构造函数体之前执行的初始化。在这种情况下,您可以这样使用它们:

SistemPornire::SistemPornire(Motor& M,Electromotor& E)
:
    m(M),
    e(E)
{}

这会使用m初始化Me初始化E

鼓励初始化程序列表用于所有成员初始化,并且具有的成员需要初始化,例如引用。与例如指针相反,指针将具有默认的垃圾值。这是合法的,尽管在实际使用指针时会调用未定义的行为。

始终必须初始化引用的原因是它们始终保证引用有效对象(而例如指针可以自由指向它们想要的任何垃圾,包括默认的垃圾值)。这种强制初始化的另一个后果是以下代码:

int someInt;
int& someReference; //Compile-time error: someReference must be intialized
someReference = someInt; //Too little, too late

正确的代码当然是:

int someInt;
int& someReference = someInt; //OK, someReference has been initialized