Форум программистов, компьютерный форум 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 13:16     Список инициализации в конструктор C++11. Зачем? #2
C++
1
CO o = { 1, 2, 3 }; //  для чего?
Так можно было и до этого.

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

Добавлено через 3 минуты
кстати без оператора = запись стала еще более бредовая.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 13:29     Список инициализации в конструктор C++11. Зачем? #6
Цитата Сообщение от SatanaXIII Посмотреть сообщение
castaway, а разницы?
А разница в том, что в первом случае - это Initializer lists
А во втором - это Uniform initialization (или extended initializer lists)
Само название говорит о том что он расширенный.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11850 / 6829 / 773
Регистрация: 27.09.2012
Сообщений: 16,931
Записей в блоге: 2
Завершенные тесты: 1
13.11.2013, 13:31     Список инициализации в конструктор C++11. Зачем? #7
Цитата Сообщение от programina Посмотреть сообщение
Может быть, я чего то недопонимаю, но я вижу эту фичу как "сбоку припека" или "не пришей кобыле хвост"...
C++
1
std :: vector vec { 1 , 2 , 3 , 4 , 5 , 6 } ;
Так применение нагляднее?
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 13:33  [ТС]     Список инициализации в конструктор C++11. Зачем? #8
Первое что приходит на ум - это массивы. Типа так:
C++
int a[] = { 1, 2, 3 };
Но ведь созданный обьект НЕ массив, хоть и содержит внутри себя массив. Выходит, что абстракция дошла до того, что конкретизирует себя. Сначала скрыли массив внутри обьекта, затем через запись всем своим видом показываем, что там где то внутри массив, типа эй, смотри тут есть массив. А что дальше? С auto такая же фигня!
Avazart
 Аватар для Avazart
6912 / 5152 / 254
Регистрация: 10.12.2010
Сообщений: 22,660
Записей в блоге: 17
13.11.2013, 13:36     Список инициализации в конструктор C++11. Зачем? #9
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
std :: vector vec { 1 , 2 , 3 , 4 , 5 , 6 } ;
Эта типа для ленивых студентов оперирующих магическими числами...
Лично я хз когда это может пригодится.

Если оперируешь std :: vector то ясное дело что он должен заполнятся в динамике, а не таки образом.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 13:37     Список инициализации в конструктор C++11. Зачем? #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;
}
Язык С++ унаследовал список инициализации от языка Си.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11850 / 6829 / 773
Регистрация: 27.09.2012
Сообщений: 16,931
Записей в блоге: 2
Завершенные тесты: 1
13.11.2013, 13:39     Список инициализации в конструктор C++11. Зачем? #11
Цитата Сообщение от Avazart Посмотреть сообщение
Эта типа для ленивых студентов оперирующих магическими числами...
так же как и любой другой сахирь
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 13:39     Список инициализации в конструктор C++11. Зачем? #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 );
?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
13.11.2013, 13:41     Список инициализации в конструктор C++11. Зачем? #13
в рекомендациях саттера пример выглядел бы так
C++
1
auto o = CO{ 1, 2, 3 };
я так понимаю, ввели это для унификации инициализации разных типов
Avazart
 Аватар для Avazart
6912 / 5152 / 254
Регистрация: 10.12.2010
Сообщений: 22,660
Записей в блоге: 17
13.11.2013, 13:42     Список инициализации в конструктор C++11. Зачем? #14
Цитата Сообщение от castaway Посмотреть сообщение
По-твоему будет проще писать так:
Логичнее что задача будет решаться
C++
1
2
for(int x=0; x<N;  ++x)
    vec.push_back( f(x) );
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 13:43  [ТС]     Список инициализации в конструктор C++11. Зачем? #15
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
std :: vector vec { 1 , 2 , 3 , 4 , 5 , 6 } ;
Так применение нагляднее?
С оператором = еще годится для обьекта, заточенного под массив, а без - нет (фор ми, как говорят англичане).

А что если обьект помимо массива еще содержит другие типы? Боюсь, что вскоре дождемся, что и операторы не надо будет перегружать, компилятор по какому-нибудь новому дополнительному иероглифу будет самостоятельно их перегружать...
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 13:46     Список инициализации в конструктор C++11. Зачем? #16
Цитата Сообщение от Avazart Посмотреть сообщение
Логичнее что задача будет решаться
Чем логичнее? Лишний цикл логики не прибавляет.
Avazart
 Аватар для Avazart
6912 / 5152 / 254
Регистрация: 10.12.2010
Сообщений: 22,660
Записей в блоге: 17
13.11.2013, 13:48     Список инициализации в конструктор C++11. Зачем? #17
Цитата Сообщение от Croessmah Посмотреть сообщение
так же как и любой другой сахирь
Ну а где приведенный пример можно использовать кроме как для демонстрации либо теста.
К примеру хранить константы можно и в массиве, зачем для этого использовать вектор?
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 13:53  [ТС]     Список инициализации в конструктор C++11. Зачем? #18
Цитата Сообщение от castaway Посмотреть сообщение
Чем логичнее? Лишний цикл логики не прибавляет.
прибавляет читаемости.

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

CO <int> o { 1, 2, 3 }; - И чего же тут неудобночитабельного?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2013, 14:08     Список инициализации в конструктор C++11. Зачем?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 14:08  [ТС]     Список инициализации в конструктор C++11. Зачем? #20
Вот так хоть и занимает больше места, но сразу видно что к чему.
C++
vector <int> v = { 1, 2, 3 };
 
CO o(v);
Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
Гадать? Т.е. сами не знаете какого типа элементы в классе/контейнере?
а если читаешь чужой код?
Yandex
Объявления
13.11.2013, 14:08     Список инициализации в конструктор C++11. Зачем?
Ответ Создать тему
Опции темы

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