Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 13:07     Список инициализации в конструктор C++11. Зачем? #1
Обьясните зачем в с++11 сделали возможность инициализировать данные м помощью списка {} ?
было вот так:
C++
CO o(1, 2, 3);
теперь можно так:
C++
CO o = { 1, 2, 3 }; //  для чего?
зачем усложнять язык?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
13.11.2013, 14:09     Список инициализации в конструктор C++11. Зачем? #21
Цитата Сообщение от programina Посмотреть сообщение
а если читаешь чужой код?
Должен сначала ознакомится с используемыми классами.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 14:13  [ТС]     Список инициализации в конструктор C++11. Зачем? #22
Гадать? Т.е. сами не знаете какого типа элементы в
классе/контейнере?
а кто говорит, что контейнер?
Вангую, найдутся такие, которые будут передавать список в конструктор обьекта неконтейнерного типа, вот и разбирайся после них в коде.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 14:13     Список инициализации в конструктор C++11. Зачем? #23
Цитата Сообщение от Avazart Посмотреть сообщение
Должен сначала ознакомится с используемыми классами.
Совершенно верно.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.11.2013, 14:16     Список инициализации в конструктор C++11. Зачем? #24
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Недавно натыкался на статейку как раз по теме
http://herbsutter.com/2013/05/09/gotw-1-solution/
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 14:19  [ТС]     Список инициализации в конструктор C++11. Зачем? #25
Цитата Сообщение от Avazart Посмотреть сообщение
Должен сначала ознакомится с используемыми классами.
если других дел нет, то можно и классы полистать. Особенно занимательно, когда пользуешься не навороченной IDE с автопоиском по всему проекту, а текстовым редактором.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
13.11.2013, 14:27     Список инициализации в конструктор C++11. Зачем? #26
Цитата Сообщение от programina Посмотреть сообщение
а текстовым редактором.
Ну если под Windows, то Notepad++ справляется с этой задачей нормально.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.11.2013, 14:34     Список инициализации в конструктор C++11. Зачем? #27
Цитата Сообщение от programina Посмотреть сообщение
Вот так хоть и занимает больше места, но сразу видно что к чему.

C++
1
2
vector <int> v = { 1, 2, 3 };
CO o(v);
Учитывая, что такая инициализация вектора невозможна без списка инициализации...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
13.11.2013, 14:40     Список инициализации в конструктор C++11. Зачем? #28
Так же стоит упомянуть о сужении типов (narrowing)
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
13.11.2013, 14:48     Список инициализации в конструктор C++11. Зачем? #29
Цитата Сообщение от ForEveR Посмотреть сообщение
Учитывая, что такая инициализация вектора невозможна без списка инициализации...
C++
1
2
3
const int n= 3;
int a[n] = { 1, 2, 3 };
CO o(a,a+n);
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.11.2013, 14:49     Список инициализации в конструктор C++11. Зачем? #30
Avazart, Я прекрасно знаю, что есть инициализация вектора через итераторы. А так же есть http://www.boost.org/doc/libs/1_54_0...doc/index.html, однако куда удобнее инициализировать через список инициализации (да и тем более, зачем мне этот массив-то тут нужен в области видимости?)
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.11.2013, 14:51     Список инициализации в конструктор C++11. Зачем? #31
Цитата Сообщение от Avazart Посмотреть сообщение
Эта типа для ленивых студентов оперирующих магическими числами...
Лично я хз когда это может пригодится.
boost::assign тоже для ленивых студентов? на простой вопрос 3 страницы г... оффтопа.
ответ на вопрос "для чего" можно получить если почитать отличие этих инициализаций.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 14:56  [ТС]     Список инициализации в конструктор C++11. Зачем? #32
Цитата Сообщение от Jupiter Посмотреть сообщение
ответ на вопрос "для чего" можно получить если почитать отличие этих инициализаций.
полностью вопрос звучит так:
зачем усложнять язык?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5437 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
13.11.2013, 14:56     Список инициализации в конструктор C++11. Зачем? #33
Цитата Сообщение от Jupiter Посмотреть сообщение
ответ на вопрос "для чего" можно получить если почитать отличие этих инициализаций
Я думаю предполагалось, что уже кто-то почитавший вкратце это пояснит.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 14:59     Список инициализации в конструктор C++11. Зачем? #34
Цитата Сообщение от programina Посмотреть сообщение
зачем усложнять язык?
А зачем придумали С++? Усложнили расширили Си..
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
13.11.2013, 15:00     Список инициализации в конструктор C++11. Зачем? #35
Нет лишнего копирования (хотя опять же а оптимизация?)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.11.2013, 15:05     Список инициализации в конструктор C++11. Зачем? #36
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.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 15:08  [ТС]     Список инициализации в конструктор C++11. Зачем? #37
Цитата Сообщение от castaway Посмотреть сообщение
А зачем придумали С++? Усложнили расширили Си..
применительно к новому, помоему именно усложнили, а не расширили.

Не судите строго, я рассуждаю с позиции новичка, который только начинает изучать с++. Из этого следует, что записи типа: CO <int> o() или СО о {} или СО о = СО(); вводят меня в ступор.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.11.2013, 15:10     Список инициализации в конструктор C++11. Зачем? #38
Цитата Сообщение от programina Посмотреть сообщение
полностью вопрос звучит так:
зачем усложнять язык?
это "заплатка" на косяк в дизайне языка - а именно декларации функции вместо создания объекта.
сделали её для того чтобы обезопасить от таких ошибок.
что касается коллекций то напишите как на С++03 инициализацию константной коллекции-члена класса.
не нравится - не используйте.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 15:25  [ТС]     Список инициализации в конструктор C++11. Зачем? #39
Цитата Сообщение от Jupiter Посмотреть сообщение
это "заплатка" на косяк в дизайне языка - а именно декларации функции вместо создания объекта.
Как по вашему, обратная совместимость нужна?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2013, 15:41     Список инициализации в конструктор C++11. Зачем?
Еще ссылки по теме:

Конструктор копирования при инициализации в header файле C++
Конструктор по умолчанию вызывается после конструктора инициализации C++
C++ Конструктор со списком инициализации: найти ошибку в коде

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.11.2013, 15:41     Список инициализации в конструктор C++11. Зачем? #40
Цитата Сообщение от programina Посмотреть сообщение
Как по вашему, обратная совместимость нужна?
Так всё старое и осталось работать в прежнем режиме.
Yandex
Объявления
13.11.2013, 15:41     Список инициализации в конструктор C++11. Зачем?
Ответ Создать тему
Опции темы

Текущее время: 05:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru