AUTOSAR C++14 Rule A12-6-1

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

Описание

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

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

Объяснение

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

class foo{
	
private:
	int i;
public:
	foo(int input){
		i = input;
		//...
	}
};
Более эффективно инициализировать элементы данных классов при помощи инициализаторов члена. Например:

  • Инициализируйте элементы данных при помощи списка инициализаторов.

  • Инициализируйте элементы данных при помощи инициализаторов члена по умолчанию.

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

Реализация Polyspace

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

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

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

Примеры

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

Этот пример показывает эффективные методы инициализации элементов данных класса, которые совместимы с этим правилом.

#include <cstdint>
#include <string>
using namespace std;
class A
{
public:
	A(int32_t n, string s) : number{n}, str{s} 
	{ //Compliant
		n += 1; // This does not violate the rule
		str.erase(str.begin(),
		str.begin() + 1); // This does not violate the rule
		// Implementation
	}  

private:
	int32_t number;
	string str;
};

class C
{
public:
	C(int32_t n, string s) 
	{ //Compliant
		n += 1; // This does not violate the rule
		str.erase(str.begin(),
		str.begin() + 1); // This does not violate the rule
	}
	// Implementation

private:

	int32_t number = 0;
	string str = "string";
	static double pi;
};
  • Конструктор класса A инициализирует элементы данных при помощи списка инициализаторов. Этот конструктор совместим с этим правилом.

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

Этот пример показывает неэффективную инициализацию элементов данных класса, которая несовместима с этим правилом.

#include <cstdint>
#include <string>
using namespace std;
class B
{
public:
	B(int32_t n, string s) 
	{ //Noncompliant
		number = n;
		str = s;
	}
	// Implementation

private:
	int32_t number;
	string str;
};
class E{
public:
	E():E(1,"string")
	{
		
	}
	E(int32_t a, string str) : number(a)
	{//Noncompliant
		
	}
private:
	int32_t number;
	string str;
};

  • Конструктор класса B инициализирует элементы данных путем копирования переданных параметров. Эта инициализация неэффективна. Элементы данных класса B могут использоваться, прежде чем они будут инициализированы. Polyspace отмечает этого неэффективного и опасного конструктора.

  • Конструктор по умолчанию класса E пытается инициализировать нестатические элементы данных путем делегирования инициализации другому конструктору. Второй конструктор не инициализирует нестатические элементы данных при помощи инициализаторов члена. Polyspace отмечает второго конструктора.

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

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