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