Используйте фигурные скобки ({}) или знак равенства (=) при инициализации переменной

Когда я читаю Язык программирования C++, 4-е издание , чтобы инициализировать переменную, автор сказал, что лучше использовать {}, чем = для инициализации переменной:

Инициализация переменной

Но я вижу, что больше людей используют =, чем {}.
Итак, какой метод является хорошим принципом для сохранения? = или {}?


person Caesium    schedule 18.12.2017    source источник
comment
Как говорит Бьерн, первые 30 лет опция {} была недоступна, поэтому в старом коде используется =. Если вы работаете с таким старым кодом, вам, вероятно, следует продолжать использовать = для согласованности. В новом коде у вас есть возможность использовать вместо него {}, а с некоторыми новыми функциями это обязательно. Итак, консистенция...   -  person Bo Persson    schedule 18.12.2017
comment
Какой из них вы используете, оставьте его неизменным и сможете читать оба   -  person Jake Freeman    schedule 18.12.2017
comment
Что мы можем сказать вам, что книга не сделала?   -  person Galik    schedule 18.12.2017
comment
Это не эквивалентно. T x = y; является инициализацией копирования (даже если копирование не происходит) и не будет работать с явными конструкторами.   -  person rustyx    schedule 18.12.2017
comment


Ответы (3)


Какой из них вы выберете, зависит от вашего собственного стиля кодирования. Самое главное, как только вы решите, какой метод использовать, используйте этот метод последовательно. Не переключайтесь между обоими методами. Я лично использую знак (=) для инициализации переменных, так как это наиболее распространенный метод инициализации переменных, который я встречал. Дополнительный стиль инициализации переменных, начиная с С++ 98 (называемый прямой инициализацией):

int variable(1)

Но я бы советовал вам не делать этого, это не сработает при определенных обстоятельствах, о которых может идти речь в вашей книге.

person Shades    schedule 18.12.2017
comment
Инициализация переменной как таковая работает в C++98. Для всех будущих читателей этот метод инициализации называется прямой инициализацией. - person FriskySaga; 15.01.2021
comment
это неправда. {} отличается и рекомендуется для нового кода Почему инициализация списка (с использованием фигурных скобок) лучше, чем альтернативы?. int variable(1) работает со времен первого стандарта C++ (C++98) - person phuclv; 18.02.2021
comment
@phuclv Спасибо! Я написал это несколько лет назад и не знал, что в то время это работало в С++ 98, я думаю, что перепутал это с инициализацией объекта X {arg}, которая (согласно cppreference), кажется, была введена в С++11. Я отредактировал сообщение, чтобы отразить это. - person Shades; 21.02.2021

Прежде чем кому-либо другому придет в голову глупая идея о том, что T a = b (где b — тип T ) заканчивается вызовом оператора присваивания,

Давайте проясним это, в C++ и в любом объектно-ориентированном языке оператор присваивания не может использоваться для еще не созданного объекта. Это инициализация, и это был вызов конструктора копирования все время, не зависящий от версии C++.

В этом случае «=» — это просто синтаксический сахар.

См. Справочник в разделе "Пояснение":

Конструктор копирования вызывается всякий раз, когда объект инициализируется (посредством прямой инициализации или инициализации копированием) из другого объекта того же типа (если разрешение перегрузки не выбирает лучшее совпадение или вызов не пропущен), что включает инициализацию: T a = b ; или Ta(b);, где b имеет тип T;

person David Chelemen    schedule 18.02.2021

Одна из причин, по которой в книге предлагается использовать инициализатор, заключается в том, что он становится начальным значением.

При использовании присваивания '=' в некоторых случаях вы в конечном итоге создаете объект, который дает ему начальное значение, а затем код использует оператор присваивания типа класса для изменения начального значения, поэтому он менее эффективен. Это только в некоторых случаях, в зависимости от доступных конструкторов и так далее.

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

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

person Sean F    schedule 18.12.2017
comment
Сейчас это редкость: en.cppreference.com/w/cpp/language/copy_elision - person Fantastic Mr Fox; 18.12.2017
comment
Да, вы правы, поэтому я сказал, что большинство современных компиляторов оптимизируют его для одного и того же. - person Sean F; 18.12.2017
comment
Посмотрим правде в глаза, причина, по которой существует так много способов сделать одно и то же, кроется в истории языка. - person Sean F; 18.12.2017
comment
Вопрос в синтаксисе инициализации, а не в назначении или инициализации. - person juanchopanza; 18.12.2017
comment
Я согласен с Хуанчопанца. код использует оператор присваивания - нет, это не так. Этот ответ просто неверен, и это хуже, чем бесполезно. - person MSalters; 18.12.2017
comment
@MSalters Угадайте, что это за символ: = Это оператор. У него есть имя. Он называется оператором присваивания. Вы можете либо использовать для него поведение C++ по умолчанию, либо задавать собственное поведение каждый раз, когда вы определяете класс. Но это то, что есть. en.cppreference.com/w/cpp/language/operators Почему на этом сайте так много людей, которые думают, что они умнее Эйнштейна? Это невероятно. Вы, ребята, придираетесь к самым глупым мелочам, потому что вы все хотите чувствовать себя самыми умными землянами на свете. - person Sean F; 20.12.2017
comment
@MSalters Вы хотите знать, что хуже бесполезности? Люди вроде вас, которые тратят свое время на чтение лекций другим людям без всякой причины, потому что это заставляет вас чувствовать себя могущественным и могущественным. Теперь вы чувствуете желание прочесть мне лекцию, почему вы правы, а веб-сайт cppreference.com ошибается. Ну, вот предложение: не делайте этого. - person Sean F; 20.12.2017
comment
@SeanF Это зависит от того, где используется = - в определенных случаях, да, это оператор присваивания (например, int a; a = 5;), в других случаях, например, в этом, ну... Это не так. В соответствии со стандартом C++, пункт 11.6.15: Инициализация, которая происходит в форме = скобки-или-равно-инициализатора или ‹...›, называется копией-инициализацией. - person Algirdas Preidžius; 20.12.2017
comment
@SeanF Вдобавок: в утверждении так много иронии, вы хотите знать, что хуже бесполезности? Люди вроде вас, которые тратят свое время на чтение лекций другим людям без всякой причины, потому что это заставляет вас чувствовать себя могущественным и могущественным. - person Algirdas Preidžius; 20.12.2017
comment
Здесь = не оператор присваивания, а один из нескольких способов вызова конструктора. Даже если исключения копирования не произошло, это вызвало бы конструктор копирования или перемещения, а не какой-либо оператор присваивания. Инициализация вызывает один или несколько конструкторов, а не оператор присваивания. Класс без оператора присваивания по-прежнему может быть скопирован или перемещен с помощью =. И наоборот, наличие оператора присваивания не имеет значения, если класс не является копируемым или перемещаемым; компилятор не будет возвращаться к построению по умолчанию, а затем к назначению. Идея, что это будет неправильно и смущающий холм, за который можно цепляться. - person underscore_d; 12.08.2020