メインコンテンツ

AUTOSAR C++14 Rule A12-6-1

All class data members that are initialized by the constructor shall be initialized using member initializers

説明

ルール定義

All class data members that are initialized by the constructor shall be initialized using member initializers.

根拠

クラスのデータ メンバーを初期化するために、渡された値のコピーをコンストラクターの本体内のデータ メンバーに割り当てるのは非効率的です。たとえば、次のコードは非効率です。

class foo{
	
private:
	int i;
public:
	foo(int input){
		i = input;
		//...
	}
};
メンバー初期化子を使用してクラスのデータ メンバーを初期化する方が効率的です。次に例を示します。

  • 初期化子リストを使用してデータ メンバーを初期化します。

  • 既定のメンバー初期化子を使用してデータ メンバーを初期化します。

コードの効率を高め、コードで未初期化のデータ メンバーが使用されないようにするには、前述の方法を使用して、クラスのデータ メンバーを初期化します。

Polyspace 実装

渡された値をデータ メンバーにコピーすることによって、コンストラクターが本体内のクラスの非静的データ メンバーを初期化する場合に、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 の既定のコンストラクターは、別のコンストラクターに初期化をデリゲートすることによって、非静的データ メンバーを初期化しようとします。2 番目のコンストラクターは、メンバー初期化子を使用して非静的データ メンバーを初期化することはしません。Polyspace は、2 番目のコンストラクターにフラグを設定します。

チェック情報

グループ: 特殊なメンバー関数
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入