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++中一个常见的陷阱,需要特别注意。

相关推荐
泡海椒3 分钟前
jquick-pdf 超详细入门教程:Java 轻量级 HTML 模板生成 PDF 工具
java·开发语言
八年。。7 分钟前
WSL学习(三)——搭建Linux + C++ + SOME/IP 基础开发环境
开发语言·笔记·ubuntu
代码王同学9 分钟前
2026.9.15日C++类和对象学习收获笔记
c语言·c++
孙启超14 分钟前
【AI开发之Rust】第 6 课:结构体、枚举与方法 —— 开始定义自己的类型
开发语言·人工智能·后端·ai·rust
刚入门的大一新生21 分钟前
Linux-简单设计libc库
linux·c++
电商API_1800790524725 分钟前
电商平台数据分析实战_帖子
开发语言·爬虫·python·数据采集·京东
传奇开心果编程1 小时前
【Rust入门知识点学与练】第36课:所有权——移动、借用、Copy、切片
开发语言·学习·rust
6Hzlia1 小时前
【Classic 150 刷题计划】 LeetCode 14. 最长公共前缀 | C++ 纵向扫描法与防越界细节
c++·算法·leetcode
传奇开心果编程1 小时前
【Rust入门知识点学与练】第35课:工具链与反馈环——先学会读编译器在说什么
开发语言·学习·rust
重生之小比特2 小时前
【Java SE】字符串 - String类
java·开发语言·intellij-idea