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

