Инициализированная переменная приоритета в основных рекомендациях класса и cpp?

Я использую 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. Является ли мое исправление правильным и совпадает с руководством?

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
    { }
};

И ваше решение использует инициализатор 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 предпочтительнее, потому что вы записываете все значения по умолчанию только один раз, а не в каждом конструкторе. Это может не быть разницей в вашем небольшом классе, но имеет значение, если у вас больше конструкторов, принимающих разные аргументы.

Другие вопросы по тегам