声明成员对象而不调用其默认构造函数

时间:2019-11-03 12:00:18

标签: c++ oop constructor

我有两个班级:GeneratorMotor。 这是Generator的精简版本:

class Generator {
private:
    Motor motor;    // this will be initialized later
                    // However, this line causes the constructor to run.
public: 
    Generator(string);
}

Generator::Generator(string filename) {
    motor = Motor(filename);     // initialisation here

}

这是Motor类的定义:

class Motor {
public:
    Motor();
    Motor(string filename);
}

Motor::Motor() {
    cout << "invalid empty constructor called" << endl;
}
Motor::Motor(string filename) {
    cout << "valid constructor called" << endl;
}

这是我的main()函数:

int main(int argc, char* argv[]) {
    Generator generator = Generator(argv[1]);
    ....
    ....
}

输出为

  

无效的空构造函数称为

     

有效的构造函数称为

如何在不调用Generator的空构造函数的情况下,将类Motor定义为具有Motor的实例?

我必须包括空的构造函数,因为g++拒绝在没有它的情况下进行编译。

1 个答案:

答案 0 :(得分:5)

您需要在Generator构造函数中使用intialization list构造:

Generator::Generator(string filename) : motor(filename) // initialization here
{
    // nothing needs to do be done here
}

您原始代码的实际作用是:

Generator::Generator(string filename) /* : motor() */ // implicit empty initialization here
{
    motor = Motor(filename) // create a temp instance of Motor
    //    ^------------------- copy it into motor using the default operator=()
                            // destruct the temp instance of Motor
}