初期化関数リストとコンストラクション関数内の付与値の違い

2165 ワード

初期化関数リストとコンストラクション関数内の付与値の違い
コンストラクション関数の初期化リストとコンストラクション関数の体内賦値がメンバー変数に賦値できる以上、両者にはどのような違いがありますか.両者は等価ですか.
一、クラスのデータメンバーが静的(const)と参照タイプである場合、初期化リストを使用する必要がある
静的(const)のデータ・メンバーは、初期化のみ可能で値を割り当てることができず、同様に参照タイプも初期化のみ可能であり、初期化リストのみが使用されます.
次のようになります.

#include <iostream>
#include <string>
using namespace std;

template<class t>
class namedptr {
public:
	namedptr(const string& initname, t *initptr);
private:
	const string name; //                  
	t * const ptr;
};



template<class t>
namedptr<t>::namedptr(const string& initname, t *initptr  )
: name(initname), ptr(initptr)
{}

//               :

//template<class t>
//namedptr<t>::namedptr(const string& initname, t *initptr)
//{
//	name = initname;
//	ptr = initptr;
//}


int main()
{
	int a  = 10;
	namedptr<int> Test("SHENZHEN",&a);
}

const string name;//静的データ・メンバーの初期化に必要な初期化リスト
t * const ptr;
静的であり、コンストラクション関数で値を割り当てるとコンパイルがエラーになります.
二、コンストラクション関数の体内賦値は追加のオーバーヘッドをもたらし、効率はコンストラクション関数の初期化リストより低い
上の例を変更します.

template<class t>
class namedptr {
public:
	namedptr(const string& initname, t *initptr);
private:
	string name; //                  
	t * ptr;
};

この2つの初期化方法を比較します.

//     :     
template<class t>
namedptr<t>::namedptr(const string& initname, t *initptr  )
: name(initname), ptr(initptr)
{}

//               :

template<class t>
namedptr<t>::namedptr(const string& initname, t *initptr)
{
	name = initname;
	ptr = initptr;
}

2つ目の方法でデータ・メンバーを初期化すると、stringのメンバー関数が2回呼び出されます.1つはデフォルトのコンストラクション関数で、もう1つは付与されます.
1つ目の方法(初期化リスト)では、デフォルトのコンストラクション関数を1回呼び出すだけで、付与関数は呼び出されません.不要な支出が削減され、クラスがかなり複雑な場合、初期化リストを使用するメリットがわかります.