5

我有这个:

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' :必须在构造函数基/成员初始化列表中初始化和 'SistemPornire::e' :必须在构造函数基/成员初始化列表中初始化

4

4 回答 4

8

您必须使用初始化列表,因为引用必须始终在创建时进行初始化:

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

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

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

于 2013-03-17T13:11:10.340 回答
0

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

SistemPornire::SistemPornire(Motor& M, Electromotor& E) : m(M), e(E) {}
于 2013-03-17T13:11:22.147 回答
0

试试这个:

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

}
于 2013-03-17T13:11:48.387 回答
0

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

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

这将m使用M和初始化eE

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

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

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
于 2013-03-17T13:13:25.797 回答