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

C++类有参构造中如何避免成员类对象自动调用默认构造函数

问题根因

C++中类的自定义类型成员,如果没有在构造函数的初始化列表中显式指定初始化方式,编译器会在进入构造函数体之前,自动调用该类型的默认构造函数完成初始化,这就是你会看到默认值打印日志的原因。你后续在构造函数体内对Address、Job成员逐字段调用setter,属于初始化完成后的二次赋值,又会触发一次传参值的打印,最终就出现了两类日志同时输出的情况。

解决方法

修改person类有参构造的实现,在初始化列表中直接用传入的AddressP、JobP参数初始化对应成员,这样会直接调用address和job类的拷贝构造函数,完全跳过默认构造的调用,就不会产生默认值的打印日志了。同时初始化完成后不需要再逐字段调用setter赋值,还能避免多余的赋值日志。

修改后的构造函数代码如下:

person::person(const char *nameP, const char *phoneNumberP, const char *emailP, address AddressP, job JobP)
// 初始化列表中显式初始化自定义类型成员,调用拷贝构造
: Address(AddressP), Job(JobP)
{
    setName(nameP);
    setPhoneNumber(phoneNumberP);
    setEmail(emailP);
    // 原有的Address、Job相关setter调用可以全部删除,不需要二次赋值
}

补充注意项

你当前的address和job类中都包含char*类型的成员,编译器默认生成的拷贝构造是浅拷贝,如果你的类析构函数中会释放char*指向的堆内存,后续会出现双重释放的野指针问题,建议补充实现深拷贝的拷贝构造函数和拷贝赋值运算符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:24:04