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

如何启用默认构造函数?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:02:55