C++类成员变量初始化的顺序是什么

C++类成员变量初始化的顺序是什么


在C++中,当初始化一个子类对象时,初始化顺序为: 首先是基类,然后是成员变量按照它们在类中声明的顺序进行初始化。初始化列表中的顺序不影响实际的初始化顺序。

示例代码

#include <iostream>

class Base 
{
public:
    Base(int val) : b(val) 
    {
        std::cout << "Base initialized with value: " << b << std::endl;
    }
private:
    int b;
};

class Derived : public Base 
{
public:
    Derived(int x, int y) : Base(y), a(x), c(a + y), b(0) 
    {
        std::cout << "Derived constructor: a = " << a << ", c = " << c << ", b = " << b << std::endl;
    }
private:
    int a;
    int c;
    int b;
};

int main() 
{
    Derived obj(5, 10);
    return 0;
}

代码解释

  1. 类声明与成员变量顺序

    • Base 类有一个私有成员变量 b
    • Derived 类继承自 Base 类,并且有三个私有成员变量:acb
  2. 构造函数初始化列表

    • Derived 类的构造函数包含一个初始化列表:Base(y), a(x), c(a + y), b(0)
    • 尽管初始化列表按这个顺序书写,成员变量的实际初始化顺序仍按它们在类中声明的顺序进行。
  3. 成员变量初始化顺序

    • Base 类的构造函数首先被调用,以 y 的值初始化基类的成员变量 b
    • 然后 Derived 类的成员变量按声明顺序依次初始化:acb
  4. 运行结果

    • 创建 Derived 对象 obj 时:
      • 基类 Base 的构造函数被调用,输出 “Base initialized with value: 10”。
      • 然后 Derived 类的成员变量按声明顺序初始化:
        • a 被初始化为 5
        • c 被初始化为 a + y,此时 a 已经被初始化为 5y10,所以 c 被初始化为 15
        • 最后 b 被初始化为 0

代码运行结果

Base initialized with value: 10
Derived constructor: a = 5, c = 15, b = 0

关键点总结

  1. 基类优先:基类部分总是在派生类部分之前初始化。
  2. 声明顺序:派生类的成员变量按照它们在类定义中的声明顺序进行初始化,而不是构造函数初始化列表中的顺序。
  3. 初始化列表中的顺序:初始化列表的顺序可以与声明顺序不同,但实际的初始化顺序还是按照声明顺序。
  4. 初始化中的依赖关系:在初始化列表中使用已初始化的变量(如 c(a + y))是安全的,但要确保所有变量在它们被使用前已被初始化。
  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Warren++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值