C++ объект без нового


это очень простой вопрос, но я не делал c++ должным образом в течение многих лет, и поэтому я немного озадачен этим. Кроме того, это не самая простая вещь (для меня по крайней мере) искать в интернете, а не за попытку.

почему это не использовать new ключевое слово и как оно работает?

в принципе, что здесь происходит?

CPlayer newPlayer = CPlayer(position, attacker);
4 52

4 ответа:

Это выражение:

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, чтобы указать на него. Объект живет, пока кто-то deletes это.

newPlayer-это не динамически выделяемая переменная, а автоматическая, выделенная стеком переменная:

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

отличается от

CPlayer newPlayer = CPlayer(pos, attacker);

newPlayer выделяется в стеке с помощью обычного вызова конструктора CPlayer (position, attacker), хотя и несколько подробного, чем обычный

CPlayer newPlayer(pos, attacker);

это в основном то же самое, что сказать:

int i = int(3);