繁体   English   中英

类成员变量的初始化顺序

[英]Order of initialization of class member variables

考虑以下代码片段:

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 ,然后用10初始化j

代码打印20 10

即,在计算ij被认为是0

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

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

在 C++20 中,它也会有未定义的行为,因为您在其生命周期之外访问j 从我在 C++17 中可以看出,在j的生命周期开始分配其存储之前,因为j的初始化是vacuous 不过,C++20 中空初始化和生命周期变化的定义。

所以无论如何,在变量初始化之前使用它是非常不明智的。

标准是否保证在这种情况下使用内置类型的默认值?

否。在这种情况下,该值是不确定的。

或者它是未定义的行为?

是的。 读取不确定值的行为未定义(窄字符类型 IIRC 除外)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM