Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2

Список инициализации в конструктор C++11. Зачем?

13.11.2013, 13:07. Показов 6549. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Обьясните зачем в с++11 сделали возможность инициализировать данные м помощью списка {} ?
было вот так:
C++
CO o(1, 2, 3);
теперь можно так:
C++
CO o = { 1, 2, 3 }; //  для чего?
зачем усложнять язык?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.11.2013, 13:07
Ответы с готовыми решениями:

Конструктор. Наследование. Список инициализации
Если есть класс, который наследует другой класс, то как задать для конструктора список инициализации? class CKub { private: ...

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

Конструктор инициализации, конструктор копирования, деструктор
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор....

40
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.11.2013, 14:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от programina Посмотреть сообщение
а если читаешь чужой код?
Должен сначала ознакомится с используемыми классами.
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 14:13  [ТС]
Гадать? Т.е. сами не знаете какого типа элементы в
классе/контейнере?
а кто говорит, что контейнер?
Вангую, найдутся такие, которые будут передавать список в конструктор обьекта неконтейнерного типа, вот и разбирайся после них в коде.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
13.11.2013, 14:13
Цитата Сообщение от Avazart Посмотреть сообщение
Должен сначала ознакомится с используемыми классами.
Совершенно верно.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2013, 14:16
Лучший ответ Сообщение было отмечено как решение

Решение

Недавно натыкался на статейку как раз по теме
http://herbsutter.com/2013/05/09/gotw-1-solution/
3
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 14:19  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Должен сначала ознакомится с используемыми классами.
если других дел нет, то можно и классы полистать. Особенно занимательно, когда пользуешься не навороченной IDE с автопоиском по всему проекту, а текстовым редактором.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.11.2013, 14:27
Цитата Сообщение от programina Посмотреть сообщение
а текстовым редактором.
Ну если под Windows, то Notepad++ справляется с этой задачей нормально.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
13.11.2013, 14:34
Цитата Сообщение от programina Посмотреть сообщение
Вот так хоть и занимает больше места, но сразу видно что к чему.

C++
1
2
vector <int> v = { 1, 2, 3 };
CO o(v);
Учитывая, что такая инициализация вектора невозможна без списка инициализации...
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
13.11.2013, 14:40
Так же стоит упомянуть о сужении типов (narrowing)
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.11.2013, 14:48
Цитата Сообщение от ForEveR Посмотреть сообщение
Учитывая, что такая инициализация вектора невозможна без списка инициализации...
C++
1
2
3
const int n= 3;
int a[n] = { 1, 2, 3 };
CO o(a,a+n);
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
13.11.2013, 14:49
Avazart, Я прекрасно знаю, что есть инициализация вектора через итераторы. А так же есть http://www.boost.org/doc/libs/... index.html, однако куда удобнее инициализировать через список инициализации (да и тем более, зачем мне этот массив-то тут нужен в области видимости?)
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.11.2013, 14:51
Цитата Сообщение от Avazart Посмотреть сообщение
Эта типа для ленивых студентов оперирующих магическими числами...
Лично я хз когда это может пригодится.
boost::assign тоже для ленивых студентов? на простой вопрос 3 страницы г... оффтопа.
ответ на вопрос "для чего" можно получить если почитать отличие этих инициализаций.
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 14:56  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
ответ на вопрос "для чего" можно получить если почитать отличие этих инициализаций.
полностью вопрос звучит так:
зачем усложнять язык?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
13.11.2013, 14:56
Цитата Сообщение от Jupiter Посмотреть сообщение
ответ на вопрос "для чего" можно получить если почитать отличие этих инициализаций
Я думаю предполагалось, что уже кто-то почитавший вкратце это пояснит.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
13.11.2013, 14:59
Цитата Сообщение от programina Посмотреть сообщение
зачем усложнять язык?
А зачем придумали С++? Усложнили расширили Си..
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.11.2013, 15:00
Нет лишнего копирования (хотя опять же а оптимизация?)
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
13.11.2013, 15:05
programina, За шкафом же. Что есть усложнение? Для меня это упрощение. Хотя universal-initialization не так уж прост как хотелось бы, однако это упрощение и новая фича, которую удобно использовать.

Заради того, чтобы понять, что есть такое list-initialization можно ведь просто прочесть параграф 8.5.4 стандарта, хотя бы примеры посмотреть. Он довольно большой, дабы копировать его сюда.

Краткое изложение параграфа
List-initialization of an object or reference of type T is defined as follows:
-If T is an aggregate, aggregate initialization is performed
-Otherwise, if the initializer list has no elements and T is a class type with a default constructor, the
object is value-initialized.
-Otherwise, if T is a specialization of std::initializer_list<E>, an initializer_list object is
constructed as described below and used to initialize the object according to the rules for initialization
of an object from a class of the same type
-Otherwise, if T is a class type, constructors are considered. The applicable constructors are enumerated
and the best one is chosen through overload resolution (13.3, 13.3.1.7). If a narrowing conversion (see
below) is required to convert any of the arguments, the program is ill-formed.
-Otherwise, if the initializer list has a single element of type E and either T is not a reference type or
its referenced type is reference-related to E, the object or reference is initialized from that element; if
a narrowing conversion (see below) is required to convert the element to T, the program is ill-formed.
-Otherwise, if the initializer list has a single element of type E and either T is not a reference type or
its referenced type is reference-related to E, the object or reference is initialized from that element; if
a narrowing conversion (see below) is required to convert the element to T, the program is ill-formed.
-Otherwise, if the initializer list has no elements, the object is value-initialized.
-Otherwise, the program is ill-formed.


Добавлено через 41 секунду
Avazart, Копирования чего? Копирование элементов есть. Тогда о чем разговор и для чего?

Ну и к слову.

C++
1
2
3
4
struct X {
X(std::initializer_list<double> v);
};
X x{ 1,2,3 };
The initialization will be implemented in a way roughly equivalent to this:
C++
1
2
double __a[3] = {double{1}, double{2}, double{3}};
X x(std::initializer_list<double>(__a, __a+3));
assuming that the implementation can construct an initializer_list object with a pair of pointers.
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 15:08  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
А зачем придумали С++? Усложнили расширили Си..
применительно к новому, помоему именно усложнили, а не расширили.

Не судите строго, я рассуждаю с позиции новичка, который только начинает изучать с++. Из этого следует, что записи типа: CO <int> o() или СО о {} или СО о = СО(); вводят меня в ступор.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.11.2013, 15:10
Цитата Сообщение от programina Посмотреть сообщение
полностью вопрос звучит так:
зачем усложнять язык?
это "заплатка" на косяк в дизайне языка - а именно декларации функции вместо создания объекта.
сделали её для того чтобы обезопасить от таких ошибок.
что касается коллекций то напишите как на С++03 инициализацию константной коллекции-члена класса.
не нравится - не используйте.
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 15:25  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
это "заплатка" на косяк в дизайне языка - а именно декларации функции вместо создания объекта.
Как по вашему, обратная совместимость нужна?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2013, 15:41
Цитата Сообщение от programina Посмотреть сообщение
Как по вашему, обратная совместимость нужна?
Так всё старое и осталось работать в прежнем режиме.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.11.2013, 15:41

Конструктор инициализации
Как передать параметры конструктору, если объект класса определен как указатель? #include &lt;iostream&gt; using...

Реализовать конструктор инициализации
Во всех заданиях необходимо реализовать конструктор инициализации (один или несколько) и конструктор без аргументов. Указанные в задании...

Конструктор со списком инициализации членов
1) Какой смысл применять синтаксис конструктора со списком инициализации членов class A{ A():_name(0),_balance( 0.0 ), _acct_nmbr( 0...

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

Определить конструктор для инициализации полей по умолчанию
У меня такое задание по лабу, кстати она самая сложная и последняя: дана структура: struct Student { char *LastName; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru