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

成员须在声明处或构造时初始化

8.11 ID_memberInitialization
目录 › next › previous

声明成员和使用成员的位置在代码中相距较远,易产生未初始化先使用的问题,所以应在成员声明处或构造函数的成员初始化列表中初始化所有成员。

示例:

struct A {
    int x;
    int y = 0;
    int z;

    A(int i): x(i) {  // Non-compliant, missing the initialization for ‘z’
    }
};

例中 x 和 y 被正确初始化,而 z 未被初始化是不符合要求的。

应在成员声明处或构造函数的成员初始化列表中初始化所有成员,下列代码也是不符合要求的:

struct T {
    string s;
    T(const char* p) {
        s = p;          // Bad, assignment is not initialization
    }
};

程序会先调用 s 的默认构造函数对其进行默认初始化,再调用其赋值运算符,产生不必要的开销,如果将其移到成员初始化列表中:

struct T {
    string s;
    T(const char* p): s(p) {  // Good
    }
};

这样 s 会被直接初始化,提高了效率,也提高了可读性。

参考

CWE-908 C++ Core Guidelines C.41
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.