重複の可能性:
コピーの初期化と直接の初期化のC ++に違いはありますか?
私はC++を学び始めたばかりです。
変数を値で初期化するために、私は出くわしました
int a = 0;
と
int a(0);
これは私を大いに混乱させます。どちらが最善の方法かわかりますか?
重複の可能性:
コピーの初期化と直接の初期化のC ++に違いはありますか?
私はC++を学び始めたばかりです。
変数を値で初期化するために、私は出くわしました
int a = 0;
と
int a(0);
これは私を大いに混乱させます。どちらが最善の方法かわかりますか?
int a = 0;
マシンで生成されたコードに違いはありint a(0);
ません。それらは同じです。
以下は、VisualStudioで生成されたアセンブリコードです。
int a = 10; // mov dword ptr [a],0Ah
int b(10); // mov dword ptr [b],0Ah
どちらも同じなので、 「最善の方法」は1つではありません。
私は個人的に使用します
int a = 0;
私はそれがより明確であり、実際にもっと広く使われていると思うからです。
これは、タイプがであるコードに適用されますint
。クラスタイプの場合、最初はコピー初期化であり、もう1つは直接初期化であるため、その場合は違いが生じます。
実用的な観点から:私はのみを使用しますint a = 0;
。
はint a(0)
許可される場合がありますが、実際には使用されません。
それはあなたのレベルであなたを悩ませるべきではないと思いますが、私たちはさらに進んでいきましょう。
a
それがintではなくクラスであるとしましょう。
class Demo{
public:
Demo(){};
Demo(int){};
};
Demo a;
Demo b(a);
Demo c = a; // clearly expressing copy-init
この例では、両方b(a)
とc=a
同じことを行います。最初のソリューションを使用することはお勧めしません。c(2)
私の理由は、それは引数からの構築に似ているということです。
このブラケットスタイルの初期化の有効な使用法は2つだけです。
Demo(int i):data(i){}
デモにintデータメンバーがある場合data
)、Demo *p=new Demo(a); // copy constructing a pointer
「最良の」方法はありません。(あなたの例のように)スカラー型int
の場合、両方の形式はまったく同じ効果を持ちます。
非クラス型のint a(0)
構文は、クラス型と非クラス型の統一された直接初期化構文をサポートするために導入されました。これは、型に依存しない(テンプレート)コードで非常に役立ちます。
非テンプレートコードでは、int a(0)
は必要ありません。int a(0)
構文を使用するか、従来の構文に固執するかは、完全にあなた次第ですint a = 0
。どちらも同じことをします。私の意見では、後者の方が読みやすいです。
とても簡単です。(まあ、ほとんど—変数に名前を付けることができないことがいくつかあります。これについては次のセクションで説明します)
宣言時に変数に値を割り当てることもできます。代入演算子(等号)を使用して変数に値を代入する場合、それは明示的な代入と呼ばれます。
int a= 5; // explicit assignment
暗黙的な割り当てを使用して、変数に値を割り当てることもできます。
int a(5); // implicit assignment
暗黙的な割り当ては関数呼び出しによく似ていますが、コンパイラーは、どの名前が変数で、どの名前が関数であるかを追跡して、適切に解決できるようにします。
教科書や文学では、1つは直接初期化であり、もう1つはコピー初期化です。ただし、マシンコードに関しては違いはありません。
違いは、()
初期化は、明示的に1つのパラメーターのみを取得する場合です。例:
できます:
int a = 44 + 2;
しかしできません:
int a(44) + 2;