В чем разница между:Каковы различные способы инициализации
long long int flag=n-1; and long long int flag(n-1);
Являются ли эти вещи такие же я видел последнюю пару раз, но не имеют правильного представления об этом.
В чем разница между:Каковы различные способы инициализации
long long int flag=n-1; and long long int flag(n-1);
Являются ли эти вещи такие же я видел последнюю пару раз, но не имеют правильного представления об этом.
long long int flag = n-1
copy initialization. Для типов классов это учитывает неявные конструкторы и пользовательские преобразования.
long long int flag(n-1)
является direct initialization. Здесь рассматриваются все конструкторы и пользовательские преобразования.
Однако эти различия имеют значение только для типов классов. Для фундаментальных типов нет разницы.
Это было довольно ясно. Мистер. Спасибо –
@chotabheem. Добро пожаловать :) – Pradhan
Строго говоря, первая называется «инициализацией копирования», а вторая называется «прямой инициализацией». Для примитивных типов нет разницы в поведении кода.
Более подробную информацию можно найти на странице http://en.cppreference.com/w/cpp/language/initialization.
Для встроенных типов, таких как перечисленные вами, нет никакой разницы.
Но если вы имели дело с объектами, то первый вызовет оператор присваивания, а второй вызовет конструктор копирования.
Так что, если бы вы перегружен оператор присваивания и конструктор копирования, а затем
operator=(const Object& rhs)
будет вызван первым, и
Object(const Object& rhs)
будет называться вторым.
Важно отметить это из-за различий в том, как ведут себя эти функции. Конструктор копирования производного объекта всегда будет вызывать все конструкторы базовых объектов. Но создание объекта всегда будет автоматически вызывать его конструктор в любом случае, и это также автоматически вызовет базовые конструкторы.
Так, например, если вы создали объект, а затем назначен его
Object o;
o = n - 1;
Тогда вы бы вызов конструктора объекта, весь его базовые конструкторов, а затем его оператор присваивания. Вот почему лучше всего использовать конструктор копирования для объектов. Для встроенных типов это не имеет значения.
Они одинаковы для скалярных типов. В общем, они разные. – Brian
«В общем, они разные». Что вы подразумеваете под этим заявлением? В каких ситуациях они отличаются? –
Настолько сложно найти на google. – LogicStuff