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