类和CPP核心指南中的初始化优先变量

Initialized priority variable in class and cpp core guidelines?

本文关键字:初始化 变量 CPP 核心 类和      更新时间:2023-10-16

我有使用C 核心检查器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来解决问题。我的修复程序是否正确并匹配指南?

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

来自CPPReference文章:

成员初始化

非静态数据成员可以以两种方式初始化:

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

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

2)通过默认成员初始化器,这仅是成员声明中包含的支撑或等于initializer,如果在成员初始化器列表中省略了会员

中使用该成员。
struct S
{
    int n = 7;
    std::string s{'a', 'b', 'c'};
    S() // copy-initializes n, list-initializes s
    { }
};

和您的解决方案使用2)

中使用的Equals Initializer

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

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是可选的,因为您只能在每个构造函数中写入所有默认值一次。这可能不是您的小班级的区别,但是如果您有更多的构造函数进行不同的论点。