2015-03-04 3 views
0

В чем разница между:Каковы различные способы инициализации

long long int flag=n-1; and long long int flag(n-1); 

Являются ли эти вещи такие же я видел последнюю пару раз, но не имеют правильного представления об этом.

+0

Они одинаковы для скалярных типов. В общем, они разные. – Brian

+0

«В общем, они разные». Что вы подразумеваете под этим заявлением? В каких ситуациях они отличаются? –

+0

Настолько сложно найти на google. – LogicStuff

ответ

6

long long int flag = n-1copy initialization. Для типов классов это учитывает неявные конструкторы и пользовательские преобразования.

long long int flag(n-1) является direct initialization. Здесь рассматриваются все конструкторы и пользовательские преобразования.

Однако эти различия имеют значение только для типов классов. Для фундаментальных типов нет разницы.

+0

Это было довольно ясно. Мистер. Спасибо –

+0

@chotabheem. Добро пожаловать :) – Pradhan

4

Строго говоря, первая называется «инициализацией копирования», а вторая называется «прямой инициализацией». Для примитивных типов нет разницы в поведении кода.

Более подробную информацию можно найти на странице http://en.cppreference.com/w/cpp/language/initialization.

0

Для встроенных типов, таких как перечисленные вами, нет никакой разницы.

Но если вы имели дело с объектами, то первый вызовет оператор присваивания, а второй вызовет конструктор копирования.

Так что, если бы вы перегружен оператор присваивания и конструктор копирования, а затем

operator=(const Object& rhs) 

будет вызван первым, и

Object(const Object& rhs) 

будет называться вторым.

Важно отметить это из-за различий в том, как ведут себя эти функции. Конструктор копирования производного объекта всегда будет вызывать все конструкторы базовых объектов. Но создание объекта всегда будет автоматически вызывать его конструктор в любом случае, и это также автоматически вызовет базовые конструкторы.

Так, например, если вы создали объект, а затем назначен его

Object o; 
o = n - 1; 

Тогда вы бы вызов конструктора объекта, весь его базовые конструкторов, а затем его оператор присваивания. Вот почему лучше всего использовать конструктор копирования для объектов. Для встроенных типов это не имеет значения.

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