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

C++中为何类需包含默认构造函数才能正常运行?

为什么自定义带参构造函数后,无参创建对象会报“no default constructor exists”错误?

这是C++的一个核心规则在起作用——当你在类里显式定义了任意构造函数(比如你写的myClass(int val)带参构造),编译器就会停止自动为这个类生成默认的无参构造函数。

先理清楚默认构造函数的作用:它是不需要传任何参数就能创建对象的构造函数。如果你的类里没有写任何构造函数,编译器会自动帮你生成一个空的默认构造函数,用来支持myClass random;这种无参实例化的写法。

回到你的错误代码:

#include <iostream>
class myClass {
public:
    myClass(int val) :x(val) {} // 显式定义了带参构造
private:
    int x;
};
int main() {
    myClass random; // 这里需要无参构造,但编译器没生成
    return 0;
}

因为你已经写了带参构造,编译器不会再自动生成无参的版本。这时候你尝试无参创建myClass对象,编译器找不到对应的构造函数,就会抛出no default constructor exists for class的错误。

而你修复后的代码里,手动添加了myClass() {}这个无参构造函数:

#include <iostream>
class myClass {
public:
    myClass(int val) :x(val) {}
    myClass() {} // 手动提供无参构造
private:
    int x;
};
int main() {
    myClass random; // 现在有对应的构造函数可以调用
    return 0;
}

这时候编译器就能找到无参构造来创建对象,代码自然就能正常运行了。

另外补充个小技巧:如果你的无参构造不需要做任何自定义逻辑,在C++11及以后的版本里,可以用myClass() = default;来让编译器帮你生成标准的默认无参构造,写法更简洁规范:

class myClass {
public:
    myClass(int val) :x(val) {}
    myClass() = default; // 让编译器生成默认无参构造
private:
    int x;
};

内容的提问来源于stack exchange,提问作者user9211358

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:49:53