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

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

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

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

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

Обьясните зачем в с++11 сделали возможность инициализировать данные м помощью списка {} ?
было вот так:
C++
CO o(1, 2, 3);
теперь можно так:
C++
CO o = { 1, 2, 3 }; //  для чего?
зачем усложнять язык?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2013, 13:07     Список инициализации в конструктор C++11. Зачем?
Посмотрите здесь:
Конструктор. Наследование. Список инициализации C++
C++ Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?
Конструктор инициализации, конструктор копирования, деструктор C++
Конструктор инициализации C++
C++ Реализовать конструктор инициализации
C++ Конструктор копирования при инициализации
Конструктор со списком инициализации членов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 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
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 13:18  [ТС]     Список инициализации в конструктор C++11. Зачем? #3
Может быть, я чего то недопонимаю, но я вижу эту фичу как "сбоку припека" или "не пришей кобыле хвост"...
SatanaXIII
Супер-модератор
Эксперт С++
5602 / 2636 / 242
Регистрация: 01.11.2011
Сообщений: 6,495
Завершенные тесты: 1
13.11.2013, 13:18     Список инициализации в конструктор C++11. Зачем? #4
castaway, а разницы?
programina
1914 / 599 / 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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 13:29     Список инициализации в конструктор C++11. Зачем? #6
Цитата Сообщение от SatanaXIII Посмотреть сообщение
castaway, а разницы?
А разница в том, что в первом случае - это Initializer lists
А во втором - это Uniform initialization (или extended initializer lists)
Само название говорит о том что он расширенный.
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
13.11.2013, 13:31     Список инициализации в конструктор C++11. Зачем? #7
Цитата Сообщение от programina Посмотреть сообщение
Может быть, я чего то недопонимаю, но я вижу эту фичу как "сбоку припека" или "не пришей кобыле хвост"...
C++
1
std :: vector vec { 1 , 2 , 3 , 4 , 5 , 6 } ;
Так применение нагляднее?
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
13.11.2013, 13:33  [ТС]     Список инициализации в конструктор C++11. Зачем? #8
Первое что приходит на ум - это массивы. Типа так:
C++
int a[] = { 1, 2, 3 };
Но ведь созданный обьект НЕ массив, хоть и содержит внутри себя массив. Выходит, что абстракция дошла до того, что конкретизирует себя. Сначала скрыли массив внутри обьекта, затем через запись всем своим видом показываем, что там где то внутри массив, типа эй, смотри тут есть массив. А что дальше? С auto такая же фигня!
Avazart
Эксперт С++
7117 / 5294 / 273
Регистрация: 10.12.2010
Сообщений: 23,415
Записей в блоге: 17
13.11.2013, 13:36     Список инициализации в конструктор C++11. Зачем? #9
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
std :: vector vec { 1 , 2 , 3 , 4 , 5 , 6 } ;
Эта типа для ленивых студентов оперирующих магическими числами...
Лично я хз когда это может пригодится.

Если оперируешь std :: vector то ясное дело что он должен заполнятся в динамике, а не таки образом.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 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
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
13.11.2013, 13:39     Список инициализации в конструктор C++11. Зачем? #11
Цитата Сообщение от Avazart Посмотреть сообщение
Эта типа для ленивых студентов оперирующих магическими числами...
так же как и любой другой сахирь
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 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.
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
Эксперт С++
7117 / 5294 / 273
Регистрация: 10.12.2010
Сообщений: 23,415
Записей в блоге: 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) );
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2013, 13:43     Список инициализации в конструктор C++11. Зачем?
Еще ссылки по теме:
C++ Конструктор со списком инициализации: найти ошибку в коде
Определить конструктор для инициализации полей по умолчанию C++
Конструктор копирования при инициализации в header файле C++
C++ Копирующий конструктор в списке инициализации членов класса
Конструктор по умолчанию вызывается после конструктора инициализации C++

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

Или воспользуйтесь поиском по форуму:
programina
1914 / 599 / 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 } ;
Так применение нагляднее?
С оператором = еще годится для обьекта, заточенного под массив, а без - нет (фор ми, как говорят англичане).

А что если обьект помимо массива еще содержит другие типы? Боюсь, что вскоре дождемся, что и операторы не надо будет перегружать, компилятор по какому-нибудь новому дополнительному иероглифу будет самостоятельно их перегружать...
Yandex
Объявления
13.11.2013, 13:43     Список инициализации в конструктор C++11. Зачем?
Ответ Создать тему
Опции темы

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