【问题标题】:Initialized priority variable in class and cpp core guidelines?在类和 cpp 核心指南中初始化优先级变量?
【发布时间】:2016-10-23 18:41:52
【问题描述】:

我已使用 C++ Core Checker nuget 并运行我的代码分析员我收到此警告

warning C26495: Variable 'Point::_x' is uninitialized. Always initialize a member variable. (type.6:

http://go.microsoft.com/fwlink/p/?LinkID=620422)

Point.h
class Point
{
private:
    int _x;
    int _y;
public:
    Point();
    Point(int x, int y) :_x(x), _y(y) {}
    ~Point();

    void  setX(int x)
    {
        _x = x;
    }
    void  setY(int y)
    {
        _y = y;
    }

    int getX()
    {
        return _x;
    }
    int getY()
    {
        return _y;
    }
}

Point.cpp
#include "Point.h"

Point::Point()
{
}


Point::~Point()
{
}

警告 C26495:变量“Point::_x”未初始化。我通过 make _x = 0 解决了这个问题。我的修复是否正确并符合指南?

【问题讨论】:

  • 是的,没错。不,它与指南不符,并且可能不会删除警告。 Point::Point() : _x(0), _y(0) 是您初始化成员变量的方式。 (对于整数,它与_x = 0; _y = 0; 相同,但对于其他类型可能不是)

标签: c++ oop cpp-core-guidelines


【解决方案1】:

在 C++11 标准中,您的修复是一个有效的解决方案。

来自cppreference 文章:

成员初始化

非静态数据成员可以通过以下两种方式之一进行初始化:

1) 在构造函数的成员初始化列表中。

struct S
{
    int n;
    std::string s;
    S() : n(7) // direct-initializes n, default-initializes s
    { }
};

2) 通过默认成员初始化器,它只是包含在成员声明中的大括号或等号初始化器,如果成员在成员初始化器列表中省略,则使用该初始化器

struct S
{
    int n = 7;
    std::string s{'a', 'b', 'c'};
    S() // copy-initializes n, list-initializes s
    { }
};

您的解决方案使用 2) 中使用的 equals 初始化程序

【讨论】:

    【解决方案2】:

    在这两个选项之间进行选择:

    1) 类内初始化(首选,默认构造函数可以默认)

    class Point
    {
    private:
        int _x{};
        int _y{};
    public:
        Point() = default;
    ...
    };
    

    2) 委托构造函数(默认构造函数委托给带 x 和 y 的构造函数)

    class Point
    {
    private:
        int _x;
        int _y;
    public:
        Point() : Point(0, 0) {}
    ...
    };
    

    选项 1 更可取,因为您只编写一次所有默认值,而不是在每个构造函数中。这在您的小类中可能没有什么不同,但如果您有更多的构造函数采用不同的参数,它就会有所不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 2019-06-24
      • 2020-05-29
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多