CodeQL 文档

构造函数委托不正确

ID: cpp/constructor-delegation
Kind: problem
Security severity: 
Severity: warning
Precision: high
Tags:
   - maintainability
   - readability
   - language-features
Query suites:
   - cpp-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

在 C++11 之前,没有机制允许构造函数将部分对象初始化委托给另一个构造函数,尽管其他语言提供了此功能。因此,任何构造函数主体中出现但未使用的构造函数调用都是可疑的。

建议

该规则会标记构造函数中未使用的构造函数调用。这通常是将一些初始化代码共享在多个构造函数之间或为一些构造函数参数提供合理默认值的错误尝试。标记的表达式的效果是在堆栈上初始化当前类的实例,然后在构造函数调用结束时让其超出范围。

有几种方法可以解决共享初始化代码的根本问题,需要根据具体情况选择最合适的方法。大体上,选项包括

  • 为构造函数参数引入实际的默认值。

  • 在每个构造函数中重复初始化代码。

  • 将初始化代码提取到一个成员函数中,并从每个构造函数中调用该函数。

  • 如果您的编译器支持,请使用 C++11 的构造函数委托功能。

示例

class Circle {
private:
  double m_x;
  double m_y;
  double m_radius;
  
  double m_area;
  
public:
  // Real constructor:
  Circle(double x, double y, double radius) :
    m_x(x), m_y(y), m_radius(radius)
  {
    m_area = 3.14159 * m_radius * m_radius;
  }
  
  Circle() {
    // WRONG: Attempt to define the unit circle by default fails.
    Circle(0, 0, 1);
  }
};

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私