类组合中构造函数编译报错,无需新增默认构造函数的解决方法
解决类成员对象无默认构造时的初始化问题
你碰到的这个编译错误,根源在于类成员对象的初始化顺序:当创建B类对象时,在进入B的构造函数体之前,B里的A obj成员会先被初始化。因为你没有显式指定它的初始化方式,编译器会尝试调用A的无参构造函数,但你的A类只定义了带参构造,所以就出现了no matching function for call to 'A::A()'的错误。
不用新增无参构造,也不用换成指针,用成员初始化列表就能完美解决问题,而且这是C++中初始化成员对象的标准最优写法。
修正后的代码:
class A { int x; public: A(int _x) { this->x = _x; } }; class B { A obj; public: // 使用成员初始化列表直接调用A的带参构造初始化obj B(int x) : obj(x) {} }; int main(){}
为什么这样能解决?
成员初始化列表的执行时机在构造函数体之前,它会直接调用A的A(int)构造函数来初始化obj,而不是像原来的代码那样:先尝试默认构造obj(这一步因为没有无参构造而失败),再在构造函数体里执行赋值操作obj=A(x)。
另外补充一点:成员初始化列表不仅能解决这个编译错误,还比构造函数体内赋值更高效——因为它避免了“默认构造+赋值”的两步操作,直接一步完成初始化。
内容的提问来源于stack exchange,提问作者matteo_c
相关产品推荐
相关产品推荐

