web-dev-qa-db-ja.com

新規なしのC ++オブジェクト

これは本当に簡単な質問ですが、私は長年にわたってc ++を適切に実行していなかったため、これに少し困惑しています。また、試してみるのではなく、インターネットで調べるのは(少なくとも私にとって)最も簡単なことではありません。

これがnewキーワードを使用しないのはなぜですか?

基本的に、ここで何が起こっていますか?

CPlayer newPlayer = CPlayer(position, attacker);
63
Henry B

この式:

CPlayer(position, attacker)

上記のコンストラクターを使用して、タイプCPlayerの一時オブジェクトを作成し、次に:

CPlayer newPlayer =...;

前述の一時オブジェクトは、コピーコンストラクターを使用してnewPlayerにコピーされます。より良い方法は、一時を避けるために以下を書くことです:

CPlayer newPlayer(position, attacker);
53
AraK

上記はスタック上にCPlayerオブジェクトを構築するため、newは必要ありません。ヒープにCPlayerオブジェクトを割り当てようとしている場合にのみ、newを使用する必要があります。ヒープ割り当てを使用している場合、コードは次のようになります。

CPlayer *newPlayer = new CPlayer(position, attacker);

この場合、deleteへの一致する呼び出しによってクリーンアップする必要があるCPlayerオブジェクトへのポインターを使用していることに注意してください。スタックに割り当てられたオブジェクトは、スコープ外になると自動的に破棄されます。

実際には、次のように書く方が簡単で明白だったでしょう。

CPlayer newPlayer(position, attacker);

とにかく、多くのコンパイラが上記に投稿したバージョンを最適化し、読みやすくなります。

42
Timo Geusch
CPlayer newPlayer = CPlayer(position, attacker);

この行は、CPlayer型の新しいローカルオブジェクトを作成します。関数のような外観にもかかわらず、これは単にCPlayerのコンストラクターを呼び出します。一時的またはコピーは含まれません。 newPlayerという名前のオブジェクトは、それが囲まれている範囲内で有効です。C++はJavaではないため、ここではnewキーワードを使用しません。

CPlayer* newPlayer = new CPlayer(position, attacker);

この行は、ヒープ上にCPlayerオブジェクトを構築し、それを指すnewPlayerという名前のポインターを定義します。オブジェクトは誰かがdeletesするまで存続します。

9

newPlayerは、動的に割り当てられる変数ではなく、自動のスタック割り当て変数です。

CPlayer* newPlayer = new CPlayer(pos, attacker);

とは異なります

CPlayer newPlayer = CPlayer(pos, attacker);

newPlayerは、通常のCPlayer(position、attacker)コンストラクター呼び出しを介してスタックに割り当てられますが、通常より多少冗長です

CPlayer newPlayer(pos, attacker);

基本的に言っていることと同じです:

int i = int(3);
5
digitalarbeiter