2009-10-03 2 views
6

Можно создать дубликат:
Is there a difference in C++ between copy initialization and assignment initialization?В чем разница между int x = 1 и int x (1) в C++?

Я новичок в C++, я редко вижу людей, использующих этот синтаксис, чтобы объявить и инициализировать переменную:

int x(1); 

Я пробовал, компилятор не жаловался, и результат такой же, как int x = 1, они на самом деле одно и то же?

Огромное спасибо вам всем.

+2

Dupe: http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-assignment-initializ –

+0

Не совсем то же самое. Этот вопрос, по-видимому, особенно касается инициализации POD. – Boojum

ответ

13

Да, для встроенных типов int x = 1; и int x(1); такие же.

При построении объектов типа класса эти два разных синтаксиса инициализации отличаются друг от друга.

Obj x(y); 

Это прямой инициализация и инструктирует компилятор искать однозначный конструктор, который принимает y, или что-то, что y может быть неявно преобразован в, и использует этот конструктор для инициализации х.

Obj x = y; 

Это инициализации копии и инструктирует компилятор для создания временного Obj путем преобразования y и использует конструктор копирования Obj «s для инициализации x.

Copy инициализационные эквивалентно прямой инициализации когда тип y такой же, как тип x.

Для копирование initalization, так как временное использование является результатом неявного преобразования, конструкторы с пометкой explicit не учитываются. Конструктор копирования для построенного типа должен быть доступен, но сама копия может быть исключена компилятором в качестве optmization.

+0

И стоит отметить, что Obj x; x = y; производит еще одну вариацию.В этом случае x будет построено по умолчанию. Затем в следующем утверждении вызывается оператор присваивания. –

+3

Еще одна вещь, которую стоит отметить, это то, что позволить таким типам старых типов данных, как int, инициализироваться таким образом (с синтаксисом, аналогичным вызову конструктора класса), позволяет шаблонам прозрачно работать как с типами POD, так и с классами. – Boojum

+1

@Boojum: добавление этой функции на язык C++ предназначалось для обеспечения единого способа инициализации объектов любого типа внутри списков инициализации. Это для меня более важная (и общая), чем инициализация внутри шаблонов, которая может быть решена с помощью синтаксиса «Type object = other_object». –

0

Я не эксперт на С ++, но если он дает тот же результат, имеет ли это значение? Я думаю, если бы вы были ДЕЙСТВИТЕЛЬНО заинтересованы, вы могли бы скомпилировать (но не собрать) свой код и посмотреть, какая разница.

Редактировать: Как уже упоминалось в другом месте, они действительно одинаковы для встроенных типов.

+4

Конечно, это важно. Вы можете увидеть те же результаты, но это может означать, что вы не знаете, какие побочные эффекты нужно искать или не знать обо всех случаях кросс, которые дадут вам разные результаты. Это очень разумные вопросы от начинающего/промежуточного программиста. – mob

1

Для POD-типов оба утверждения идентичны.

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

  • Нет связанных вопросов^_^