You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类组合中构造函数编译报错,无需新增默认构造函数的解决方法

解决类成员对象无默认构造时的初始化问题

你碰到的这个编译错误,根源在于类成员对象的初始化顺序:当创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:58:13