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