4

重複の可能性:
いつ直接初期化を使用し、いつコピー初期化を使用する必要がありますか?

私は両方のことを知っています

int a = 1;

int a(1);

C ++で動作しますが、どちらを使用する方が良いと考えられていますか?

4

3 に答える 3

11

int違いがないからです。int a = 1;構文はcopy-initialzationで、一方int a(1);direct-initializationです。コンパイラは、一般的なクラス型に対しても同じコードを生成することがほぼ保証されていますが、コピー初期化では、宣言されたコピー コンストラクターがクラスにないexplicitことが必要です。

これを詳しく説明すると、直接初期化では、対応するコンストラクターが直接呼び出されます。

T x(arg);

一方、コピー初期化は、コピーが作成されたかのように動作します。

T x = arg; // "as if" T x(T(arg));, but implicitly so

コピー省略は明示的に許可され、推奨されますが、「as if」構造は引き続き有効でなければなりません。つまり、コピー コンストラクターはアクセス可能で、明示的または削除されてはなりません。例:

struct T
{
    T(int) { } // one-argument constructor needed for `T x = 1;` syntax

    // T(T const &) = delete;            // Error: deleted copy constructor
    // explicit T(T const &) = default;  // Error: explicit copy constructor
    // private: T(T const &) = default;  // Error: inaccessible copy constructor
};
于 2012-06-02T16:52:38.733 に答える
1

すべてが 1 と 0 の場合、どちらも同じになります。一貫性を保つようにしてください。

于 2012-06-02T16:44:52.843 に答える
1

例のようにプリミティブ型を使用している場合、違いはありません。クラスを使用すると、代入形式はコピー コンストラクターへの追加の呼び出しを伴う可能性があるため、理論的には効率が低下します。ただし、実際には、この呼び出しはほとんど常に最適化されると予想されます。

一方、2 番目の形式は、C++ で最も厄介な parseとして知られている、次のようなステートメントで発生する可能性があります。

a b(c());

変数定義ではなく、関数宣言として解釈されます。

2 番目の問題は 1 番目の問題よりも気になるので、一貫して変数定義の代入スタイルを使用しています。

于 2012-06-02T16:58:54.503 に答える