C++成员变量的初始化顺序

参考于C++ Primer P259


前言

对于成员变量的初始化顺序来说,初始值列表和构造函数存在一定的差异。


一、初始值列表(会存在错误)

当执行如下代码时,看上去仿佛是先用val初始化了 j ,然后再用初始化后 j 的值初始化了 i ,但实际上并非如此

class a {
private :
    int i, j;
public :
    a(int val) : j(val), i(j) {};
    void print() {
        cout << "i " << i << endl;
        cout << "j " << j << endl;
    }
};
int main() {
    a test(2);
    test.print();
    return 0;
}

它的输出结果为
在这里插入图片描述

因为它的执行顺序是, i 先被初始化,然后j被 val 初始化,因此这个初始值为未定义的 j 初始化了 i 。

初始值列表成员的初始化顺序与他们在类中定义中的出先顺序一致,第一个成员先被初始化,然后第二个…构造函数初始值列表中值的前后位置关系不会影响实际的初始化顺序。

二、构造函数

代码如下:

class a {
private :
    int i, j;
public :
    //a(int val) : j(val), i(j) {};
    a (int val) {
        j = val;
        i = j;
    }
    void print() {
        cout << "i " << i << endl;
        cout << "j " << j << endl;
    }
};
int main() {
    a test(2);
    test.print();
    return 0;
}

执行效果如下
在这里插入图片描述
构造函数可以正常执行初始化操作

总结

构造函数初始化列表中出值的前后位置关系不会影响实际的初始化顺序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值