私は両方のことを知っています
int a = 1;
と
int a(1);
C ++で動作しますが、どちらを使用する方が良いと考えられていますか?
私は両方のことを知っています
int a = 1;
と
int a(1);
C ++で動作しますが、どちらを使用する方が良いと考えられていますか?
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
};
すべてが 1 と 0 の場合、どちらも同じになります。一貫性を保つようにしてください。
例のようにプリミティブ型を使用している場合、違いはありません。クラスを使用すると、代入形式はコピー コンストラクターへの追加の呼び出しを伴う可能性があるため、理論的には効率が低下します。ただし、実際には、この呼び出しはほとんど常に最適化されると予想されます。
一方、2 番目の形式は、C++ で最も厄介な parseとして知られている、次のようなステートメントで発生する可能性があります。
a b(c());
変数定義ではなく、関数宣言として解釈されます。
2 番目の問題は 1 番目の問題よりも気になるので、一貫して変数定義の代入スタイルを使用しています。