web-dev-qa-db-ja.com

c ++()または{}でのコンストラクターの委任

私は次のコードでStroustrupの this link を読みます:

_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}{}

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

16
Govan

()は、括弧が空の場合は 値の初期化 を使用し、空でない場合は 直接の初期化 を使用します。

{}リストの初期化 を使用します。つまり、中括弧が空の場合は 値の初期化 を意味し、初期化されたオブジェクトが集約の場合は 集合の初期化 を使用します。 。

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

16
emlai

初期化値は、括弧または中括弧で指定できます。

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

中括弧は、括弧または等号の代わりに使用でき、均一性を高め、混乱を減らすために導入されました。

これは構文上の構造にすぎず、パフォーマンス上の利点やペナルティは発生しません。

2
dspfnder