2015-10-17 7 views
8

私は次のコードでStroustrup氏のthis linkを読む:私の質問はラインについてです(C++のコンストラクタを委任)または{}

class X { 
     int a; 
    public: 
     X(int x) { if (0<x && x<=max) a=x; else throw bad_X(x); } 
     X() :X{42} { } 
     X(string s) :X{lexical_cast<int>(s)} { } 
     // ... 
    }; 

X() X{42}{}

は間のいずれかの違いがありますかっこと中かっこ?
違いがない場合は、他の関数呼び出しで中括弧も使用できますか?それとも、コンストラクターの委任にありますか? 最後になぜ両方の構文を使用する必要がありますか?それはちょっとあいまいです。

+1

「関数呼び出しで中括弧を使用することはできますか、それともコンストラクタの委譲にのみ使用できますか?」 - コンストラクタの委譲は関数呼び出しではありません。関数呼び出しで '{}'を使うことは決してできません。 – emlai

+0

これを確認してください:http://stackoverflow.com/questions/18222926/why-is-list-initialization-using-curly-braces-better-than-the-alternatives –

答えて

7

()は、かっこが空の場合はvalue initialization、空でない場合はdirect initializationを使用します。

{}は、中括弧がvalue initializationの場合はvalue initialization、初期化されたオブジェクトが集約の場合はaggregate initializationを意味します。

Xは単純なintであるため、()または{}で初期化しても違いはありません。

+0

私が正しく理解するならば、私が 'X ():X(42){} '次にinteコンストラクタを呼び出していますが、' X():X {42} {} 'を書いていれば、別のコンストラクタを呼び出さずにmemebr変数を初期化しています。 – Govan

+0

@Govan - 'int'や' double'のようなプリミティブ型は本格的なオブジェクトではありません。彼らはコンストラクタを持っていません。 –

+0

@DavidHammen私はプリミティブなint constructorでないX(intコンストラクタ)を意味します。 – Govan

0

初期値は、かっこまたは中かっこで指定できます。

中括弧の初期化はC++ 11で導入され、すべての非静的変数に使用できる「統一初期化」を意味します。

中かっこの代わりに中かっこを使用して、均一性を高め混乱を減らすことができます。

これは構文上の構文であり、パフォーマンス上の利点や罰則はありません。