类和cpp核心指南中初始化的优先级变量?

时间:2016-06-22 02:34:09

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

我使用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解决了这个问题。我的修复是否正确并且与指南相符?

2 个答案:

答案 0 :(得分:2)

在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)中使用的等于初始化程序

答案 1 :(得分:0)

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

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是可取的,因为您只写一次所有默认值,而不是在每个构造函数中。这在您的小类中可能不会有什么不同,但是如果您有更多的构造函数采用不同的参数,则会有所不同。