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