对如何初始化班级成员感到困惑

时间:2016-04-01 08:47:12

标签: c++ class

假设我正在使用一个名为Engine的类。据我所知,初始化此类并创建新对象的方法可以像下面这样完成:

string type = "v8";
Engine engine(type);

这会创建一个新的Engine对象...... 那么现在如果我有一个名为Car的第二个类,它有一个Engine类的成员:

Car.h

class Car
{
    private:
        Engine engine;
    public:
        Car();
}

Car.cpp

Car::Car() {
    // Need to initialize Engine
}

如何初始化成员引擎,是不是已经从头文件初始化了?我很困惑,因为如果Engine有多态构造函数,其中一个构造函数Engine()和另一个Engine(字符串),它不会在Car头中初始化吗?如何告诉Car我想要一个将在Car的构造函数

中初始化的空引擎成员

2 个答案:

答案 0 :(得分:2)

它的工作原理如下:

Car::Car(void) : engine("whatever you want")
{
}

这说明了如何初始化类的成员。 不同的Car构造函数重载可以以不同的方式初始化您的引擎

答案 1 :(得分:0)

您有3个选项(从C ++ 11开始)。

您可以使用类内初始值设定项。像这样:

struct A {
    int i = 42;
};

您可以使用成员初始化列表。像这样:

struct B {
B() : i{42} {}
    int i;
};

或者您可以在构造函数体中分配成员(如果它具有默认构造函数,则在默认初始化之后)。像这样:

struct C {
    C() { i = 42; }
    int i;
};

最后一个选项通常不是你想要的,因为在这种情况下,成员将首先默认构造为在输入构造函数体之前发生的成员初始化的一部分(参见上面的struct B)然后你随后分配给它。这与我在这些示例中使用的类似int的类型无关,但是对于构造和分配它的类型而言,它可能很重要。

您还可以组合3种形式。例如:

struct D {
    D() : i{1} // this overrules the in-class initializer
    { i = 3; // assign a new value despite the fact that we constructed the object already
    }
    int i = 0; // initial value
};