C++构造函数重载问题:嵌套构造函数调用未初始化成员变量
构造函数互相调用的问题解析
两种写法的本质差异
Java式写法的错误原因:
在MyClass的默认构造函数体内写MyClass(42);时,这并不是让当前正在构造的对象调用带参构造函数,而是创建了一个临时的MyClass对象。这个临时对象会在该语句执行完毕后立即销毁,完全不会修改当前对象的m_a成员。当前对象的m_a会按照默认规则初始化(比如int类型默认值为0),所以最终结果是0。委托构造的正确逻辑:
MyClass1的默认构造函数使用MyClass1() : MyClass1(42) {}的写法,这是C++11引入的委托构造语法。它的作用是让当前正在构造的对象,直接调用类内的另一个重载构造函数来完成初始化流程。带参构造函数会把m_a设置为42,所以最终实例的m_a值符合预期。
代码示例对比
错误写法(MyClass)
class MyClass { public: int m_a; MyClass() { // 创建临时对象,与当前实例无关 MyClass(42); } MyClass(int a) : m_a(a) {} };
正确写法(MyClass1)
class MyClass1 { public: int m_a; // 委托构造:当前实例调用带参构造函数 MyClass1() : MyClass1(42) {} MyClass1(int a) : m_a(a) {} };
关键总结
C和Java的构造函数调用规则不同:Java允许在构造函数体内通过this(...)调用其他构造函数,但C不支持这种写法。C++要实现构造函数间的互相调用,必须使用成员初始化列表中的委托构造语法,直接在构造函数体内调用构造函数只会生成临时对象,无法影响当前实例的成员变量。
内容的提问来源于stack exchange,提问作者DDS
相关产品推荐
相关产品推荐

