Объект С++ без новых
Это очень простой вопрос, но я долго не делал С++ в течение многих лет, и поэтому я немного озадачен этим. Кроме того, это не самая легкая вещь (по крайней мере для меня), чтобы искать в Интернете, а не пытаться.
Почему это не использует ключевое слово new
и как оно работает?
В принципе, что здесь происходит?
CPlayer newPlayer = CPlayer(position, attacker);
Ответы
Ответ 1
Это выражение:
CPlayer(position, attacker)
создает временный объект типа CPlayer
с использованием указанного выше конструктора, а затем:
CPlayer newPlayer =...;
Указанный временный объект копируется с использованием конструктора копирования в newPlayer
. Лучше всего написать следующее, чтобы избежать временного:
CPlayer newPlayer(position, attacker);
Ответ 2
Вышеупомянутый объект создает объект CPlayer в стеке, поэтому ему не нужно new
. Вам нужно использовать new
, если вы пытаетесь выделить объект CPlayer в куче. Если вы используете распределение кучи, код будет выглядеть следующим образом:
CPlayer *newPlayer = new CPlayer(position, attacker);
Обратите внимание, что в этом случае мы используем указатель на объект CPlayer, который нужно будет очистить с помощью соответствующего вызова до delete
. Объект, выделенный в стеке, будет автоматически уничтожен, когда он выходит из области видимости.
На самом деле было бы проще и понятнее написать:
CPlayer newPlayer(position, attacker);
Многие компиляторы оптимизируют версию, которую вы отправили выше, и яснее читать.
Ответ 3
CPlayer newPlayer = CPlayer(position, attacker);
Эта строка создает новый локальный объект типа CPlayer. Несмотря на свой функциональный внешний вид, это просто вызывает конструктор CPlayer. Никакие временные или копирование не задействованы. Объект с именем newPlayer живет до тех пор, пока область приложения не включена. Вы не используете ключевое слово new
здесь, потому что С++ не является Java.
CPlayer* newPlayer = new CPlayer(position, attacker);
Эта строка создает объект CPlayer в куче и определяет указатель с именем newPlayer, чтобы указать на него. Объект живет до тех пор, пока не будет delete
.
Ответ 4
newPlayer не является динамически распределенной переменной, а переменной auto, назначенной стеком:
CPlayer* newPlayer = new CPlayer(pos, attacker);
отличается от
CPlayer newPlayer = CPlayer(pos, attacker);
newPlayer выделяется в стеке через вызов конструктора CPlayer (позиция, атакующий), хотя и несколько подробный, чем обычный
CPlayer newPlayer(pos, attacker);
Это в основном то же самое, что сказать:
int i = int(3);