Участник, не инициализированный в конструкторе

Конструктор не инициализирует некоторых членов класса

Описание

Неинициализированный участник происходит, когда конструктор класса имеет по крайней мере один путь к выполнению, на котором он не инициализирует некоторые элементы данных класса.

Дефект не появляется в следующих случаях:

  • Пустые конструкторы.

  • Неинициализированный участник не используется в коде.

Риск

У участников, которых не инициализирует конструктор, могут быть непреднамеренные значения, когда вы читаете их позже.

Инициализация всех участников в конструкторе облегчает использовать ваш класс. Если вы вызываете отдельный метод инициализировать ваших участников и затем считать их, можно избежать неинициализированных значений. Однако кто-то еще использующий ваш класс может считать член класса прежде, чем вызвать ваш метод инициализации. Поскольку конструктор называется, когда вы создаете объект класса, если вы инициализируете всех участников в конструкторе, у них не может быть неинициализированных значений позже.

Фиксация

Лучшая практика состоит в том, чтобы инициализировать всех участников в вашем конструкторе, предпочтительно в списке инициализаций.

Примеры

развернуть все

class MyClass {
public:
    explicit MyClass(int);
private:
    int _i;
    char _c;
};

MyClass::MyClass(int flag) {
    if(flag == 0) {
        _i = 0;
        _c = 'a';
    }
    else {
        _i = 1;
    }
}

В этом примере, если flag не 0, участник, не инициализируется _c.

Дефект появляется на закрывающей фигурной скобке конструктора. Следующее является некоторыми советами для навигации в исходном коде:

  • На панели Result Details смотрите, какие участники не инициализируются.

  • Чтобы перейти к определению класса, щелкните правой кнопкой по участнику, который инициализируется в конструкторе. Выберите Go To Definition. В определении класса вы видите всех участников, включая тех участников, которые не инициализируются в конструкторе.

Исправление — инициализирует всех участников на всех путях к выполнению

Одно возможное исправление должно инициализировать всех членов класса MyClass для всех значений flag.

class MyClass {
public:
    explicit MyClass(int);
private:
    int _i;
    char _c;
};

MyClass::MyClass(int flag) {
    if(flag == 0) {
        _i = 0;
        _c = 'a';
    }
    else {
        _i = 1;
        _c = 'b';
    }
}

Информация о результате

Группа: Объектно-ориентированный
Язык: C++
Значение по умолчанию: 'off'
Синтаксис командной строки: NON_INIT_MEMBER
Влияние: носитель
ID CWE: 456, 457, 908

Введенный в R2015b