AUTOSAR C++14 Rule A12-1-2

И NSDMI, и нестатический инициализатор представителей в конструкторе не должны использоваться в одном типе

Описание

Определение правила

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

Объяснение

Можно инициализировать нестатический представитель данных класса одним из следующих способов:

  • В объявлении представителя в теле класса с помощью нестатического инициализатора представителя данных (NSDMI)

  • При помощи нестатического инициализатора представителя в конструкторе

В классе инициализация подмножества нестатических представителей данных с помощью NSDMI и инициализация остальных нестатических представителей данных с помощью конструктора снижает читаемость кода. Этот шаблон кода может вызвать путаницу для считывателя о том, какие начальные значения для каждого представителя данных фактически используются. Использование NSDMI или конструктора для инициализации всех нестатических представителей класса избегает этой потенциальной путаницы.

Конструкторы переноса и копирования освобождены от этого правила, потому что эти конструкторы имеют особое поведение инициализации представителей данных путем использования их существующих значений из других объектов. Эти конструкторы вряд ли вызовут путаницу у читателя.

Реализация Polyspace

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

Чекер не помечает конструкторы перемещения и копирования, которые нарушают это правило.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

#include <cstdint>
#include <utility>

class A
{
  public:
    A() : i1{0}, i2{0} // Compliant, i1 and i2 are initialized by the constructor only
    {
    }
	
  private:
    std::int32_t i1;
    std::int32_t i2;
};

class B
{
  private:
    std::int32_t i1{0};
    std::int32_t i2{0}; // Compliant, i1 and i2 are initialized by NSDMI only
};

class C
{
  public:
    C() : i2{0}   // Noncompliant, i1 is initialized by NSDMI, i2 is initialized by constructor
    {
    }

  private:
    std::int32_t i1{0};
    std::int32_t i2;
};

class D
{
    D(D const& oth) : i1{oth.i1}, i2{oth.i2} // Compliant by exception, copy constructor
    {
    }

    D(D&& oth): i1{std::move(oth.i1)}, i2{std::move(oth.i2)} 
    // Compliant by exception, move constructor
    {
    }

  private:
    std::int32_t i1{0};
    std::int32_t i2{0};
};

В этом коде только конструктор в C классов не соответствует этому правилу кодирования, поскольку:

  • Данные представители i1 инициализируется при помощи NSDMI.

  • Данные представители i2 инициализируется в конструкторе.

Проверяйте информацию

Группа: Специальные функции представителей
Категория: Необходимый, Автоматизированный
Введенный в R2020b