代码之家  ›  专栏  ›  技术社区  ›  Ahmad

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

  •  2
  • Ahmad  · 技术社区  · 5 年前

    我有两个班: Generator Motor . 这是一个精简版的 发电机 以下内容:

    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]);
        ....
        ....
    }
    

    输出是

    调用的空构造函数无效

    调用的有效构造函数

    如何定义类 发电机 举个例子 电动机 不调用的空构造函数 电动机 ,直到以后?

    我必须包含空构造函数,因为 g++ 拒绝编译没有它。

    1 回复  |  直到 5 年前
        1
  •  5
  •   Naomi    5 年前

    你需要使用 intialization list 你的建筑 Generator 施工单位:

    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
    }