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

相关推荐
寻寻觅觅☆9 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
fpcc9 小时前
并行编程实战——CUDA编程的Parallel Task类型
c++·cuda
l1t9 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
赶路人儿10 小时前
Jsoniter(java版本)使用介绍
java·开发语言
ceclar12310 小时前
C++使用format
开发语言·c++·算法
码说AI11 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS11 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
lanhuazui1011 小时前
C++ 中什么时候用::(作用域解析运算符)
c++
charlee4411 小时前
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
c++·faiss·onnx·rag·语义搜索
星空下的月光影子11 小时前
易语言开发从入门到精通:补充篇·网络爬虫与自动化采集分析系统深度实战·HTTP/HTTPS请求·HTML/JSON解析·反爬策略·电商价格监控·新闻资讯采集
开发语言