MST

星途 面试题库

面试题:C++类构造函数自动调用与成员初始化列表

已知类定义如下:class Member { public: Member(int num) { std::cout << "Member constructor with value " << num << std::endl; } }; class Outer { private: Member m; int data; public: Outer(int val) : data(val) { std::cout << "Outer constructor" << std::endl; } }; 在上述代码中,构造函数Outer的成员初始化列表只初始化了data,没有显式初始化m。请说明Member m的构造函数何时被调用,以及为什么这样调用?如果要优化,应该如何修改代码?
26.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. Member m的构造函数调用时机及原因

    • 调用时机:在Outer类的构造函数执行体之前调用。
    • 原因:当创建Outer类的对象时,对象中的成员变量会按照它们在类中声明的顺序依次进行初始化。Member mOuter类中声明,虽然在Outer构造函数的成员初始化列表中没有显式初始化m,但编译器会自动调用Member类的默认构造函数(如果存在)来初始化m。然而,这里Member类没有默认构造函数,只有带参数的构造函数Member(int num),所以编译器会报错,因为它不知道如何初始化m
  2. 优化代码 可以在Outer构造函数的成员初始化列表中显式初始化m,示例代码如下:

class Member {
public:
    Member(int num) {
        std::cout << "Member constructor with value " << num << std::endl;
    }
};

class Outer {
private:
    Member m;
    int data;
public:
    Outer(int val) : m(val), data(val) {
        std::cout << "Outer constructor" << std::endl;
    }
};

这样,在创建Outer对象时,m会使用Member(int num)构造函数进行初始化,传递给Outer构造函数的val值也传递给了m的构造函数。