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
相关产品推荐
相关产品推荐

