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