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

相关推荐
Datacarts1 天前
亚马逊爆款选品:数据采集与三方服务商对接
开发语言·人工智能·python·信息可视化
always_TT1 天前
C语言保留字与标识符规则
c语言·开发语言
yang_upup1 天前
Matlab里simulink的元器件介绍
开发语言·matlab
滑雪的企鹅.1 天前
Kotlin云头条技术点剖析(项目复习02)——用户协议页面
android·开发语言·kotlin
南 阳1 天前
Python从入门到精通day59
开发语言·python·php
JMchen1231 天前
Android NDK开发从入门到实战:解锁应用性能的终极武器
android·开发语言·c++·python·c#·android studio·ndk开发
会飞De琥珀1 天前
java工具类,字符串转时间
java·开发语言
源码潇潇和逸逸1 天前
独立部署高校圈子平台:PHP+UniApp打造社交+交易+服务一站式校园解决方案
开发语言·uni-app·php
LINgZone21 天前
深入解析:Cglib与JDK动态代理的实现原理、区别及性能对比
java·开发语言
一次旅行1 天前
今日心理学知识分享(三)
开发语言·javascript·程序人生·ecmascript