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