Объект С++ без новых - программирование
Подтвердить что ты не робот

Объект С++ без новых

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

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

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

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

Ответ 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);