2017-09-05 9 views
1

私はしばらくの間C++から離れていました。定義されたクラスのプライベートメンバー変数(存在する場合)のこの2つのデフォルトコンストラクタの初期化の違いを判断しようとしています。クラス定義はヘッダファイルにあり、実装は別のファイルにあります。すべてのプライベートメンバー変数を "0"または意味のない値に初期化する必要があります。コンストラクタでのプライベートメンバー初期化の違い(C++)

注:

intデータは、[MAX_SIZE]固定サイズのコンパイル時の配列です。 int used:配列のインデックストラッカーです。

一般的に、私は次のようにメンバーを初期化することに慣れてる、スピーキング:

// Default Constructor 
IntSet::IntSet() 
{ 
    data[MAX_SIZE-1] = {0} 
    used = 0; 
} 

私はいくつかのレガシーコードをコーミングと完全に異なる構文を見つけることだ:

// Default Constructor 
IntSet::IntSet() : used(0) 
{ 
    data[MAX_SIZE-1] = {0}; 
} 

があります最終結果の違いは?

+0

2番目のスニペットと同じように[初期化リスト](http://en.cppreference.com/w/cpp/language/initializer_list)を推奨します。 VLAはC++では使用できません。 – Ron

+0

ここではVLAは使用されていません。すべての作業は、データの最後の値を0に設定することです。 – user4581301

答えて

5

メンバーは、構築時に初期化され、の前には、の前にコンストラクタの本体に達します。それらが異なる場合があります。たとえば:

  • メンバーがconstのか参照である場合、それは初期化子リストで初期化されなければならない、とメンバーにはデフォルトコンストラクタを持っていない場合は、コンストラクタ本体

  • に初期化することはできません(またはアクセス権がない)場合は、コンストラクタに引数を使用する必要があります。これは初期化子リストでのみ行うことができます。

  • オブジェクトが "大きくて高価"で作成したり割り当てたりする場合は、デフォルトでオブジェクトを作成し、その上で代入演算子を使用することで非効率的な処理を行うことができます。整数とあなたのような原始的な、PODタイプ(むしろ、同時にその初期値でそれを構築するよりも。)

デフォルトの建設を説明自明であるので、いずれかの方法は、参考に上記の制限を考えると、相当し、 constなど。

+0

補遺:[Member Initializer List](http://en.cppreference.com/w/cpp/language/initializer_list)の詳細情報 – user4581301

+0

ありがとうございます説明および他の読書への言及。心から感謝する! "used"を "0"に設定している間、配列のすべての要素をNULL値に初期化するより良い方法はありますか? –

+0

@AlexanderMaxwellコンストラクタ初期化子リストで配列を初期化することはできません。そのためには、各要素をNULLに初期化するためにforループまたは同等のループを使用する必要があります。 –

関連する問題