2009-11-19 3 views
50

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

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

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

CPlayer newPlayer = CPlayer(position, attacker); 

ответ

42

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

CPlayer(position, attacker) 

создает временный объект типа CPlayer, используя вышеупомянутый конструктор, то:

CPlayer newPlayer =...; 

Указанных временный объект копируется с помощью конструктора копирования для newPlayer , Лучший способ, чтобы написать следующее, чтобы избежать временных объектов:

CPlayer newPlayer(position, attacker); 
+0

Блестящий, спасибо. –

+5

На самом деле компилятор, вероятно, оптимизирует его. В этом случае конструктор копирования не будет вызван. http://stackoverflow.com/questions/1758142/why-copy-constructor-is-not-called-in-this-case – BostonLogan

+4

Назначение в объявлении не менее эффективно, чем использование синтаксиса конструктора. Если бы они были отдельными заявлениями, то было бы правильно, если бы было замечание о временных. Суть в том, что это объявляет CPlayer (обычно в стеке), а не выделяет пространство для него из свободного хранилища (кучи). –

31

выше конструирует объект CPlayer в стеке, поэтому он не нуждается в new. Вам нужно всего лишь использовать new, если вы пытаетесь выделить объект CPlayer в куче. Если вы используете выделение динамической памяти, код будет выглядеть следующим образом:

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

Обратите внимание, что в данном случае мы используем указатель на объект CPlayer, который необходимо будет очищен с помощью согласующего вызова delete , Объект, выделенный в стеке, будет автоматически уничтожен при выходе из области видимости.

На самом деле было бы проще и более очевидным, чтобы написать:

CPlayer newPlayer(position, attacker); 

Многие компиляторы оптимизируют версию, размещенную на выше в любом случае, и это более читаемой. не

+0

Я не думаю, что это правильно: «Объект, выделенный в куче, будет автоматически уничтожен, когда он выходит из сферы действия». – Valentin

+0

Вы правы, я хотел написать «стек», а не «кучу». Спасибо за указание на это. –

+0

Согласитесь с этим. Мы должны сохранить код C++ в том же стиле, что и код C. Итак, 'CPlayer newPlayer (position, attacker);' лучше, чем 'CPlayer newPlayer = CPlayer (позиция, атакующий);' если вы хотите создать переменную стека. – tonga

4

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

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

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

CPlayer newPlayer = CPlayer(pos, attacker); 

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

CPlayer newPlayer(pos, attacker); 

Это в основном то же самое, как говорят:

int i = int(3); 
+2

Осторожно здесь. Это «инициализация копирования». Это * не * задание. – sellibitze

+0

Я стою исправлено, это не задание; даже конструктор копирования не задействован. Отредактируйте ответ соответственно. – digitalarbeiter

+2

Конечно, копия ctor (по крайней мере, логически) задействована. Вы заметите, что если вы сделаете свою копию ctor конфиденциальной. Затем эта инициализация копии больше не будет работать. Стандарт C++ требует доступной копии ctor, даже если компилятор способен оптимизировать копию. – sellibitze

8
CPlayer newPlayer = CPlayer(position, attacker); 

Эта строка создает новый локальный объект типа CPlayer. Несмотря на свой функциональный внешний вид, это просто вызывает конструктор CPlayer. Никакие временные или копирование не задействованы. Объект с именем newPlayer живет до тех пор, пока он не включен. Вы не используете ключевое слово new, потому что C++ не является Java.

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

Эта строка создает объект CPlayer в куче и определяет указатель с именем newPlayer, чтобы указать на него. Объект живет до кого-то delete.

+2

«Нет временного или копирования» - это не совсем так. Таких гарантий нет. Но каждый достойный компилятор должен лишить копию. – sellibitze

Смежные вопросы