AUTOSAR C++14 Rule A12-1-3

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

Описание

Управляйте определением

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

Объяснение

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

Когда все пользовательские конструкторы инициализируют нестатические элементы данных к тому же значению, использование пользовательского конструктора в целях инициализации является ненужным. Лучшая практика должна инициализировать нестатические элементы данных непосредственно в определении класса. Такая нестатическая инициализация элемента данных в классе (NSDMI) позволяет вам использовать безошибочного и эффективного неявного конструктора, чтобы получить экземпляр класса, которому инициализировали элементы данных к значения по умолчанию.

Реализация Polyspace

Polyspace отмечает нестатическое объявление элемента данных, если любое из этих условий верно:

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

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

Это средство проверки не применяется:

  • Скопируйте и переместите конструкторов

  • Определения объединения

  • Массивы, которые инициализируются в конструкторах

  • Объекты, которые являются инициализированным полем полем в конструкторах

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

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

#include <cstdint>
#include <string>
class MessageBox1
{
public:
	MessageBox1() : LowerLeft(0), UpperRight(0.0F), msg()
	{
	}
	// ...

private:

	int LowerLeft;     // Noncompliant
	float UpperRight;  // Noncompliant
	std::string msg;    // Noncompliant
};

class MessageBox2
{
public:
	// ...

private:
	int LowerLeft = 0;     // Compliant
	float UpperRight = 0.0F;         // Compliant
	std::string msg = "";   // Compliant
};
class MessageBox3
{
public:
	MessageBox3() : LowerLeft(0), UpperRight(0.0F), msg()
	{
	}
	

private:
	int LowerLeft = 0;      // Noncompliant 
	float UpperRight = 0.0F;          // Noncompliant
	std::string msg = "";    // Noncompliant 
};
class MessageBox4
{
public:
	MessageBox4() : LowerLeft(0), UpperRight(0.0F), msg()
	{
	}
	// ...
	MessageBox4(int int_i): LowerLeft(int_i),UpperRight(0.1F), msg("str"){}
private:

	int LowerLeft;     // Compliant
	float UpperRight;            // Compliant - Initialized differently in two c'tor
	std::string msg = "";//Noncompliant -  Initialized differently in two c'tor
};

В этом примере Polyspace отмечает нестатические инициализации элемента данных, которые нарушают это правило. Например:

  • В классе MessageBox1, объявления элементов данных несовместимы, потому что они инициализируются пользовательским конструктором вместо инициализацией в классе. Лучшая практика должна объявить такие элементы данных непосредственно в классе и использовать неявных конструкторов по умолчанию.

  • В классе MessageBox2, объявления элементов данных совместимы, потому что они инициализируются непосредственно в классе, и класс не задает пользовательского конструктора.

  • В классе MessageBox3, объявления элементов данных несовместимы, потому что они инициализируются ans в классе одновременно, конструктор класса инициализирует элементы данных. Практика должна объявить элементы данных в классе и не использовать определяемого пользователем конструктора.

  • В классе MessageBox4:

    • Объявление AA::LowerLeft и AA::UpperLeft совместимы, потому что два различных конструктора инициализируют их к различным значениям, и они не инициализируются в классе.

    • Объявление AA::msg несовместимо, потому что два различных конструктора инициализируют его к различному значению, и это также инициализируется в классе.

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

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