C++ объект без нового
это очень простой вопрос, но я не делал c++ должным образом в течение многих лет, и поэтому я немного озадачен этим. Кроме того, это не самая простая вещь (для меня по крайней мере) искать в интернете, а не за попытку.
почему это не использовать new
ключевое слово и как оно работает?
в принципе, что здесь происходит?
CPlayer newPlayer = CPlayer(position, attacker);
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, чтобы указать на него. Объект живет, пока кто-то
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);