exponenta event banner

Правило AUTOSAR C++ 14 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