C++成员变量的初始化顺序由它们在类中的声明顺序决定,而不是初始化列表中的顺序

1. 代码结构分析

cpp 复制代码
class Test
{
public:
    Test(int data=100) : mb(data), ma(mb) {}
    void show() { cout << "ma:" << ma << " mb:" << mb << endl; }
private:
    int ma;
    int mb;
};

int main()
{
    Test t1;
    t1.show();
    return 0;
}
  • 类定义Test 类包含两个私有成员 mamb,以及一个带默认参数的构造函数和一个打印函数。
  • 构造函数 :使用了初始化列表,看起来是先初始化 mb,再用 mb 初始化 ma
  • 主函数 :创建了一个 Test 对象 t1,并调用 show() 打印成员变量。

2. 关键问题:初始化顺序

在C++中,成员变量的初始化顺序由它们在类中的声明顺序决定,而不是初始化列表中的顺序

  • 在类的声明中,int ma; 出现在 int mb; 之前。
  • 因此,构造函数初始化列表的实际执行顺序是:
    1. 先初始化 ma,使用的是 mb 的值,但此时 mb 还未被初始化,是一个随机的垃圾值。
    2. 然后初始化 mb,将其赋值为 data(即100)。

3. 运行结果

当执行 t1.show() 时,输出结果是未定义的:

  • mb 的值是确定的,为 100
  • ma 的值是未定义的,它是在 mb 初始化之前就被赋值的垃圾值,无效值,-958993460,0xcc

4. 正确的写法

为了避免这种问题,应该确保初始化列表的顺序与成员声明顺序一致,或者避免在初始化一个成员时使用另一个未初始化的成员。

cpp 复制代码
class Test
{
public:
    // 修正:先初始化mb,再用mb初始化ma,同时保证声明顺序一致
    Test(int data=100) : mb(data), ma(mb) {} 
private:
    int mb; // 调整声明顺序,先声明mb
    int ma;
};

或者更稳妥地直接使用参数初始化:

cpp 复制代码
Test(int data=100) : ma(data), mb(data) {}

总结

这段代码的核心问题在于成员变量的初始化顺序与初始化列表顺序不一致 ,导致 ma 被初始化为一个未定义的值。这是C++中一个常见的陷阱,需要特别注意。

相关推荐
郝学胜_神的一滴8 小时前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
众少成多积小致巨1 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
clint4565 天前
C++进阶(1)——前景提要
c++
夜悊5 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴5 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0016 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
LDR0066 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术6 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园6 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob6 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio