☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

成员初始化应遵循声明的顺序

8.14 ID_disorderedInitialization
目录 › next › previous

类成员的初始化顺序是按声明的顺序进行的,初始化前面的成员时不可使用后面成员的值。

示例:

struct A {
    int* p;
    size_t n;

    A(size_t s): n(s), p(new int[n])  // Non-compliant
    {}
};

虽然在初始化列表中 n 在 p 的前面,但 p 先于 n 声明,n 仍然在 p 之后被初始化,“p(new int[n])”会造成严重错误。

应改为:

struct A {
    size_t n;
    int* p;

    A(size_t s): n(s), p(new int[n])  // Compliant
    {}
};

调整了 n 和 p 的声明顺序,使 n 先于 p 初始化即可。

如果使用后面成员的地址初始化前面的成员,则不受本规则约束,如:

struct B {
    int*& a;
    int*  b;
    int   c[3];

    B():
        a(b),  // OK
        b(c)   // OK
    {}
};

例中 a 为引用,b 的地址在初始化之前就确定了,所以“a(b)”没问题;c 为数组,也是一个地址,所以“b(c)”没有问题。

依据

ISO/IEC 14882:2003 12.6.2(5) ISO/IEC 14882:2011 12.6.2(10)

参考

C++ Core Guidelines C.47 SEI CERT OOP53-CPP
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.