如何启用默认构造函数?Makefile设置及编译报错解决
解决C++中默认构造函数缺失导致的编译报错问题
嗨,我来帮你搞定这个编译错误~
首先得搞清楚为啥会报错:当你给TEST结构体自定义了带参数的构造函数TEST(int aa, int bb)之后,C++编译器就不会自动生成默认的无参构造函数了。而你代码里的TEST a;和TEST b;都是在试图调用这个不存在的无参构造,所以编译器就会抛出no matching function for call to 'TEST::TEST()'的错误。
下面给你两种可行的解决方案,你可以根据需求选:
方案一:显式要求编译器生成默认构造函数(C++11及以上推荐)
在结构体里添加TEST() = default;,这样编译器就会帮你生成和默认行为一致的无参构造函数:
struct TEST{ int a; int b; TEST() = default; // 显式生成默认构造 TEST(int aa, int bb) : a(aa), b(bb) {} }; int main() { TEST a; TEST b; a = b; return 0; }
这种方式的好处是完全遵循编译器自动生成默认构造的规则,比如int类型的成员a和b会保持未初始化状态(和你没写任何构造函数时的行为一样)。
方案二:给现有构造函数的参数设置默认值
如果你希望默认构造时成员变量有初始值,可以给带参构造的参数加上默认值,这样它就能同时支持带参调用和无参调用:
struct TEST{ int a; int b; TEST(int aa = 0, int bb = 0) : a(aa), b(bb) {} }; int main() { TEST a; // 这里会自动用aa=0、bb=0来初始化 TEST b; a = b; return 0; }
这种方案相当于把一个构造函数当成两种用法,如果你不需要单独的无参构造,这种写法会更简洁。
另外要注意:如果你手动写空的构造函数TEST() {},成员变量a和b也会是未初始化的垃圾值,但= default的写法更规范,更推荐在C++11及以后的版本中使用。
内容的提问来源于stack exchange,提问作者Roy
相关产品推荐
相关产品推荐

