Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

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

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

Обьясните зачем в с++11 сделали возможность инициализировать данные м помощью списка {} ?
было вот так:
http://www.cyberforum.ru/cpp-beginners/thread868701.html
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++):

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

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

Конструктор инициализации
Как передать параметры конструктору, если объект класса определен как...

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

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

40
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 13:16 #2
C++
1
CO o = { 1, 2, 3 }; //  для чего?
Так можно было и до этого.

Теперь можно так:
C++
1
CO o{ 1, 2, 3 };
0
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 13:18  [ТС] #3
Может быть, я чего то недопонимаю, но я вижу эту фичу как "сбоку припека" или "не пришей кобыле хвост"...
0
SatanaXIII
Супер-модератор
Эксперт С++
5765 / 2763 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
13.11.2013, 13:18 #4
castaway, а разницы?
0
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 13:25  [ТС] #5
Цитата Сообщение от castaway;
Теперь можно так:
C++
1
CO o{ 1, 2, 3 };
хотела так написать, но почему то усомнилась.

Добавлено через 3 минуты
кстати без оператора = запись стала еще более бредовая.
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 13:29 #6
Цитата Сообщение от SatanaXIII Посмотреть сообщение
castaway, а разницы?
А разница в том, что в первом случае - это Initializer lists
А во втором - это Uniform initialization (или extended initializer lists)
Само название говорит о том что он расширенный.
1
Croessmah
++Ͻ
14146 / 8071 / 1512
Регистрация: 27.09.2012
Сообщений: 19,905
Записей в блоге: 3
Завершенные тесты: 1
13.11.2013, 13:31 #7
Цитата Сообщение от programina Посмотреть сообщение
Может быть, я чего то недопонимаю, но я вижу эту фичу как "сбоку припека" или "не пришей кобыле хвост"...
C++
1
std :: vector vec { 1 , 2 , 3 , 4 , 5 , 6 } ;
Так применение нагляднее?
1
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 13:33  [ТС] #8
Первое что приходит на ум - это массивы. Типа так:
C++
int a[] = { 1, 2, 3 };
Но ведь созданный обьект НЕ массив, хоть и содержит внутри себя массив. Выходит, что абстракция дошла до того, что конкретизирует себя. Сначала скрыли массив внутри обьекта, затем через запись всем своим видом показываем, что там где то внутри массив, типа эй, смотри тут есть массив. А что дальше? С auto такая же фигня!
0
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,044
Записей в блоге: 17
13.11.2013, 13:36 #9
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
std :: vector vec { 1 , 2 , 3 , 4 , 5 , 6 } ;
Эта типа для ленивых студентов оперирующих магическими числами...
Лично я хз когда это может пригодится.

Если оперируешь std :: vector то ясное дело что он должен заполнятся в динамике, а не таки образом.
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 13:37 #10
programina, ты немного отстала от жизни
Так можно было делать еще в Си.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
struct A {
    int a;
    int b;
    int c;
};
 
int main()
{
    struct A a = { 1, 2, 3 };
    printf( "%d, %d, %d\n", a.a, a.b, a.c );
    return 0;
}
Язык С++ унаследовал список инициализации от языка Си.
0
Croessmah
++Ͻ
14146 / 8071 / 1512
Регистрация: 27.09.2012
Сообщений: 19,905
Записей в блоге: 3
Завершенные тесты: 1
13.11.2013, 13:39 #11
Цитата Сообщение от Avazart Посмотреть сообщение
Эта типа для ленивых студентов оперирующих магическими числами...
так же как и любой другой сахирь
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 13:39 #12
Цитата Сообщение от Avazart Посмотреть сообщение
Эта типа для ленивых студентов оперирующих магическими числами...
По-твоему будет проще писать так:
C++
1
2
3
4
5
6
7
std::vector vec;
vec.push_back( 1 );
vec.push_back( 2 );
vec.push_back( 3 );
vec.push_back( 4 );
vec.push_back( 5 );
vec.push_back( 6 );
?
0
I.M.
566 / 549 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
13.11.2013, 13:41 #13
в рекомендациях саттера пример выглядел бы так
C++
1
auto o = CO{ 1, 2, 3 };
я так понимаю, ввели это для унификации инициализации разных типов
0
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,044
Записей в блоге: 17
13.11.2013, 13:42 #14
Цитата Сообщение от castaway Посмотреть сообщение
По-твоему будет проще писать так:
Логичнее что задача будет решаться
C++
1
2
for(int x=0; x<N;  ++x)
    vec.push_back( f(x) );
0
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 13:43  [ТС] #15
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
std :: vector vec { 1 , 2 , 3 , 4 , 5 , 6 } ;
Так применение нагляднее?
С оператором = еще годится для обьекта, заточенного под массив, а без - нет (фор ми, как говорят англичане).

А что если обьект помимо массива еще содержит другие типы? Боюсь, что вскоре дождемся, что и операторы не надо будет перегружать, компилятор по какому-нибудь новому дополнительному иероглифу будет самостоятельно их перегружать...
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 13:46 #16
Цитата Сообщение от Avazart Посмотреть сообщение
Логичнее что задача будет решаться
Чем логичнее? Лишний цикл логики не прибавляет.
0
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,044
Записей в блоге: 17
13.11.2013, 13:48 #17
Цитата Сообщение от Croessmah Посмотреть сообщение
так же как и любой другой сахирь
Ну а где приведенный пример можно использовать кроме как для демонстрации либо теста.
К примеру хранить константы можно и в массиве, зачем для этого использовать вектор?
0
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 13:53  [ТС] #18
Цитата Сообщение от castaway Посмотреть сообщение
Чем логичнее? Лишний цикл логики не прибавляет.
прибавляет читаемости.

а по поводу:
C++
CO o { 1, 2, 3 };
еще надо угадать с типом этих 1,2,3 , иначе без применения шаблона не обойтись. Никогда не поверю, что запись типа:
C++
CO <int> o { 1, 2, 3 };
может быть удобочитаемой. Не в этой вселенной.
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 14:01 #19
Цитата Сообщение от programina Посмотреть сообщение
еще надо угадать с типом этих 1,2,3
Гадать? Т.е. сами не знаете какого типа элементы в классе/контейнере?
Если на то пошло, то при каком-то другом способе добавления элементов вы гадать не будете? Например при push_back по-вашему гадать не придется?

CO <int> o { 1, 2, 3 }; - И чего же тут неудобночитабельного?
0
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 14:08  [ТС] #20
Вот так хоть и занимает больше места, но сразу видно что к чему.
C++
vector <int> v = { 1, 2, 3 };
 
CO o(v);
Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
Гадать? Т.е. сами не знаете какого типа элементы в классе/контейнере?
а если читаешь чужой код?
0
13.11.2013, 14:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2013, 14:08
Привет! Вот еще темы с решениями:

Конструктор со списком инициализации членов
1) Какой смысл применять синтаксис конструктора со списком инициализации членов...

Конструктор копирования при инициализации в header файле
Добрый вечер, где можно почитать про данное поведение? #include &lt;iostream&gt;...

Копирующий конструктор в списке инициализации членов класса
Добрый день. Сегодня обнаружил кое-что для себя странное и непонятное. В...

Конструктор со списком инициализации: найти ошибку в коде
здравствуйте, есть вот такой кусок шаблонного класса и инициализирующий...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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