これは本当に簡単な質問ですが、私は長年にわたってc ++を適切に実行していなかったため、これに少し困惑しています。また、試してみるのではなく、インターネットで調べるのは(少なくとも私にとって)最も簡単なことではありません。
これがnew
キーワードを使用しないのはなぜですか?
基本的に、ここで何が起こっていますか?
CPlayer newPlayer = CPlayer(position, attacker);
この式:
CPlayer(position, attacker)
上記のコンストラクターを使用して、タイプCPlayer
の一時オブジェクトを作成し、次に:
CPlayer newPlayer =...;
前述の一時オブジェクトは、コピーコンストラクターを使用してnewPlayer
にコピーされます。より良い方法は、一時を避けるために以下を書くことです:
CPlayer newPlayer(position, attacker);
上記はスタック上にCPlayerオブジェクトを構築するため、new
は必要ありません。ヒープにCPlayerオブジェクトを割り当てようとしている場合にのみ、new
を使用する必要があります。ヒープ割り当てを使用している場合、コードは次のようになります。
CPlayer *newPlayer = new CPlayer(position, attacker);
この場合、delete
への一致する呼び出しによってクリーンアップする必要があるCPlayerオブジェクトへのポインターを使用していることに注意してください。スタックに割り当てられたオブジェクトは、スコープ外になると自動的に破棄されます。
実際には、次のように書く方が簡単で明白だったでしょう。
CPlayer newPlayer(position, attacker);
とにかく、多くのコンパイラが上記に投稿したバージョンを最適化し、読みやすくなります。
CPlayer newPlayer = CPlayer(position, attacker);
この行は、CPlayer型の新しいローカルオブジェクトを作成します。関数のような外観にもかかわらず、これは単にCPlayerのコンストラクターを呼び出します。一時的またはコピーは含まれません。 newPlayerという名前のオブジェクトは、それが囲まれている範囲内で有効です。C++はJavaではないため、ここではnew
キーワードを使用しません。
CPlayer* newPlayer = new CPlayer(position, attacker);
この行は、ヒープ上にCPlayerオブジェクトを構築し、それを指すnewPlayerという名前のポインターを定義します。オブジェクトは誰かがdelete
sするまで存続します。
newPlayerは、動的に割り当てられる変数ではなく、自動のスタック割り当て変数です。
CPlayer* newPlayer = new CPlayer(pos, attacker);
とは異なります
CPlayer newPlayer = CPlayer(pos, attacker);
newPlayerは、通常のCPlayer(position、attacker)コンストラクター呼び出しを介してスタックに割り当てられますが、通常より多少冗長です
CPlayer newPlayer(pos, attacker);
基本的に言っていることと同じです:
int i = int(3);