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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

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

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

Обьясните зачем в с++11 сделали возможность инициализировать данные м помощью списка {} ?
было вот так:
C++
CO o(1, 2, 3);
теперь можно так:
C++
CO o = { 1, 2, 3 }; //  для чего?
зачем усложнять язык?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2013, 13:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Список инициализации в конструктор C++11. Зачем? (C++):

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

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

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

Конструктор инициализации - C++
Как передать параметры конструктору, если объект класса определен как указатель? #include <iostream> using namespace...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.11.2013, 14:51 #31
Цитата Сообщение от Avazart Посмотреть сообщение
Эта типа для ленивых студентов оперирующих магическими числами...
Лично я хз когда это может пригодится.
boost::assign тоже для ленивых студентов? на простой вопрос 3 страницы г... оффтопа.
ответ на вопрос "для чего" можно получить если почитать отличие этих инициализаций.
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 14:56  [ТС] #32
Цитата Сообщение от Jupiter Посмотреть сообщение
ответ на вопрос "для чего" можно получить если почитать отличие этих инициализаций.
полностью вопрос звучит так:
зачем усложнять язык?
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
13.11.2013, 14:56 #33
Цитата Сообщение от Jupiter Посмотреть сообщение
ответ на вопрос "для чего" можно получить если почитать отличие этих инициализаций
Я думаю предполагалось, что уже кто-то почитавший вкратце это пояснит.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 14:59 #34
Цитата Сообщение от programina Посмотреть сообщение
зачем усложнять язык?
А зачем придумали С++? Усложнили расширили Си..
0
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,674
Записей в блоге: 17
13.11.2013, 15:00 #35
Нет лишнего копирования (хотя опять же а оптимизация?)
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
13.11.2013, 15:05 #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.
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 15:08  [ТС] #37
Цитата Сообщение от castaway Посмотреть сообщение
А зачем придумали С++? Усложнили расширили Си..
применительно к новому, помоему именно усложнили, а не расширили.

Не судите строго, я рассуждаю с позиции новичка, который только начинает изучать с++. Из этого следует, что записи типа: CO <int> o() или СО о {} или СО о = СО(); вводят меня в ступор.
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.11.2013, 15:10 #38
Цитата Сообщение от programina Посмотреть сообщение
полностью вопрос звучит так:
зачем усложнять язык?
это "заплатка" на косяк в дизайне языка - а именно декларации функции вместо создания объекта.
сделали её для того чтобы обезопасить от таких ошибок.
что касается коллекций то напишите как на С++03 инициализацию константной коллекции-члена класса.
не нравится - не используйте.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 15:25  [ТС] #39
Цитата Сообщение от Jupiter Посмотреть сообщение
это "заплатка" на косяк в дизайне языка - а именно декларации функции вместо создания объекта.
Как по вашему, обратная совместимость нужна?
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.11.2013, 15:41 #40
Цитата Сообщение от programina Посмотреть сообщение
Как по вашему, обратная совместимость нужна?
Так всё старое и осталось работать в прежнем режиме.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
13.11.2013, 15:41 #41
programina, Не всегда, не везде. Если бы С++ избавился от груза обратной совместимости с С, как поступил D - было бы отлично, но этого никогда не будет. Обратная совместимость между версиями языка (С++98 и С++11) есть и по-хорошему быть должна и есть.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2013, 15:41
Привет! Вот еще темы с ответами:

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

Конструктор со списком инициализации: найти ошибку в коде - C++
здравствуйте, есть вот такой кусок шаблонного класса и инициализирующий конструктор этого класса: std::allocator&lt;T&gt; data; typename...

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

Копирующий конструктор в списке инициализации членов класса - C++
Добрый день. Сегодня обнаружил кое-что для себя странное и непонятное. В общем-то смотрим код: #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.11.2013, 15:41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru