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
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 456, 457, 908
Введенный в R2015b