首页 > 解决方案 > 类成员变量的初始化顺序

问题描述

考虑以下代码片段:

class A
{
public:
    A(int a, int b) : j(a), i(j + b) {}
    int i, j;
};

int main()
{
    A a(10, 20);
    std::cout << a.i << " " << a.j << std::endl;
    return 0;
}

该标准规定成员变量的初始化顺序是它们被声明的顺序。在这种情况下,i将在之前初始化j。由于j尚未初始化,i = *a garbage value* + 20, 然后j用 初始化10

代码打印 20 10

即,在计算时j被认为是。0i

标准是否保证在这种情况下使用内置类型的默认值?或者只是垃圾值恰好是0?还是未定义的行为

标签: c++constructorinitializer-list

解决方案


j + bj是未定义的行为,因为它在允许这样做的特定实例之一之外使用不确定的值(在其初始化之前的值)(所有这些都与char变体有关std::byte,而不是int不确定的值)。

在 C++20 中,它也会有未定义的行为,因为您是j在它的生命周期之外访问的。据我所知,在 C++17 中以及在 的生命周期j开始之前分配其存储空间,因为 的初始化jvacuous。但是,C++20 中的空初始化和生命周期的定义发生了变化。

因此,在任何情况下,在初始化之前使用变量都是非常不明智的。


推荐阅读