Member not initialized in constructor

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

Описание

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

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

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

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

Риск

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

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

Фиксация

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

Примеры

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

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