C++带对象参数的类构造函数报错问题及解决方法
报错具体含义
- C++类构造函数的执行流程分为两个核心阶段:首先是初始化列表阶段,所有类成员会在这个阶段被依次构造;之后才会执行构造函数花括号内的函数体逻辑。
- 你的代码中
CTimeStamp类不存在可调用的无参默认构造函数,编译器在尝试自动为m_Stamp成员生成默认初始化逻辑时,找不到匹配的无参构造入口,因此抛出编译错误。 - 你原先写在构造函数体内部的
m_Stamp = mStamp本质是赋值操作:此时m_Stamp已经完成了默认构造流程,再用传入的参数值覆盖原有内容,这和成员初始化是完全不同的逻辑,自然绕不开默认构造函数的调用要求。
修复方法
要实现你预期的调用逻辑,完全不需要修改现有调用代码,只需要将CContact的构造函数调整为使用成员初始化列表的写法即可:
class CContact { public: CTimeStamp m_Stamp; int m_Num1; int m_Num2; // 调整为初始化列表形式的构造函数 CContact(CTimeStamp mStamp, int i, int i1) : m_Stamp(mStamp), m_Num1(i), m_Num2(i1) { // 无需在函数体内再写成员赋值逻辑 } };
- 修改后的逻辑会在初始化阶段,直接调用
CTimeStamp的拷贝构造函数,用传入的mStamp参数构造m_Stamp成员,全程不需要调用CTimeStamp的无参默认构造函数,从根本上解决编译报错。 - 你原本编写的
test.addContact(CContact(CTimeStamp(1, 2, 3, 4, 5, 6), 999999999, 777777777));这类调用代码,在上述修改完成后可以正常编译运行。 - 补充语法规则:只要类中包含没有默认构造函数的类类型成员,就必须在成员初始化列表中显式为该成员指定构造参数,这是C++的强制语法要求,无法通过构造函数体内的赋值操作绕过。
内容的提问来源于stack exchange,提问作者Etoail
相关产品推荐
相关产品推荐

