exponenta event banner

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