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

Двоеточие в конструкторе, что это? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 84, средняя оценка - 4.76
Drus
 Аватар для Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
02.11.2011, 14:39     Двоеточие в конструкторе, что это? #1
Пример - конкретно из книги дейтела, вопрос вызывает двоеточие после конструктора, если оно позвляет производить инициализацию - то почему не делать бы этого в теле. Было бы очень хорошо если бы кто-нибудь ткнул носом в мануал по возможным вариантам использования этой вундервафли.
C++
1
String::String( const char *s):length( ( s != 0) ? strlen(2) : 0){/*...*/}
Поиском по форуму не нашел, если было - прошу понять, простить (с)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.11.2011, 14:39     Двоеточие в конструкторе, что это? #2
Drus, Cписок инициализации.
Drus
 Аватар для Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
02.11.2011, 14:53  [ТС]     Двоеточие в конструкторе, что это? #3
Нашел темы, почитал. Возникла каша в голове.

Как я понял:

Это список, в котором через запятую перечислены пары из имени члена класса и значения, которое необходимо ему присвоить, взятого в скобки (с)

Вот какой вопрос гложет: а есть ли разница инициализации списком и инициализации в теле конструктора, и какой вариант предпочтительнее?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.11.2011, 15:00     Двоеточие в конструкторе, что это? #4
Drus, Через список инициализация происходит шустрее. + к тому константные данные можно инициализировать только через список.
Drus
 Аватар для Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
02.11.2011, 15:01  [ТС]     Двоеточие в конструкторе, что это? #5
спасибо огромное!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.11.2011, 15:01     Двоеточие в конструкторе, что это? #6
http://liveworkspace.org/code/bfdaf1...ccd65452fee539

и

http://liveworkspace.org/code/1ae88c...27a35f6e1f6b70

Так же базовые классы инициализируются только через список.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.11.2011, 15:21     Двоеточие в конструкторе, что это? #7
Цитата Сообщение от Drus Посмотреть сообщение
пары из имени члена класса и значения, которое необходимо ему присвоить, взятого в скобки (с)
В частном случае. Вообще в скобках - параметры конструктора этого члена, так что значений там может быть и несколько.

http://liveworkspace.org/code/c40ff0...bb83db70c04019
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.11.2011, 15:39     Двоеточие в конструкторе, что это? #8
Цитата Сообщение от ForEveR Посмотреть сообщение
Через список инициализация происходит шустрее
думаю что слово "шустрее" неуместно, список инициализации просто инициализирует перед тем как войти в тело конструктора
Drus
 Аватар для Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
02.11.2011, 15:39  [ТС]     Двоеточие в конструкторе, что это? #9
Цитата Сообщение от talis Посмотреть сообщение
параметры конструктора этого члена
сильно помогло в осознании, спс. Сразу как-то не совместил что инициализация и есть конструктор, вот и не понимал смысла
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.11.2011, 15:40     Двоеточие в конструкторе, что это? #10
Почитайте про
Цитата Сообщение от ForEveR Посмотреть сообщение
Захват Ресурса Есть Инициализация (RAII)
Bers
Заблокирован
02.11.2011, 16:14     Двоеточие в конструкторе, что это? #11
Цитата Сообщение от Jupiter Посмотреть сообщение
думаю что слово "шустрее" неуместно, список инициализации просто инициализирует перед тем как войти в тело конструктора
Уместно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class CBase
{
    int a;
public: CBase(): a(0) { std::cout<<"Запущен конструктор по умолчанию CBase\n"; }
public: CBase(const int nA): a(nA) { std::cout<<"Запущен конструктор с параметром CBase\n"; }
public: CBase& operator=(const int nA){ a=nA; std::cout<<"Запущен operator= CBase\n"; return *this; }
};
 
class CTest
{
    CBase val;
    public: CTest(): val(100) { std::cout<<"Запущен конструктор CTest\n"; }
};
 
class CTest2
{
    CBase val;
public: CTest2()     { std::cout<<"Запущен конструктор CTest2\n";     val=100;    }
};
 
class CTest3
{
    CBase& val;
public: CTest3(CBase& nVal) : val(nVal) //по другому не компилирует
        {
            std::cout<<"Запущен конструктор CTest3\n"; 
            //val=nVal; //не позволяет сделать вот так
        }
};
 
 
int main (void)
{
 
    CTest myTest1;
    CTest2 myTest2; //обратите внимание, что здесь имеет место двойная инициализация. 
                    //Создание объекта конструктором по умолчанию, а потом настройка 
                    //его данных членов с помощью оператора=
 
    CBase temp; CTest3 myTest3(temp );
    
    return 0;
}
Тест1 и тест2 наглядно демонстрируют, что инициализация агрегата через инициализацию его агрегированных данных выполняется шустрее, потому что использует минус одно действие.

http://liveworkspace.org/code/aa3e08...935555b514beff
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.11.2011, 16:31     Двоеточие в конструкторе, что это? #12
Цитата Сообщение от Bers Посмотреть сообщение
Тест1 и тест2 наглядно демонстрируют, что инициализация агрегата через инициализацию его агрегированных данных выполняется шустрее, потому что использует минус одно действие.
да хоть десять инициализаций - все десять мемберов проинициализируются за 10N, но это никак не влияет на само N
все это в теории конечно ибо состояние системы в целом разное в каждый момент времени
Bers
Заблокирован
02.11.2011, 16:35     Двоеточие в конструкторе, что это? #13
Цитата Сообщение от Jupiter Посмотреть сообщение
да хоть десять инициализаций - все десять мемберов проинициализируются за 10N, но это никак не влияет на само N
все это в теории конечно ибо состояние системы в целом разное в каждый момент времени
Есть разница:

1.Член сразу получил нужное состояние.

и

2. Член получил дефолтное состояние. Член изменил дефолтное состояние на нужное.

?


Вам не кажется, что во втором случае двойная работа происходит?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.11.2011, 16:42     Двоеточие в конструкторе, что это? #14
Цитата Сообщение от Bers Посмотреть сообщение
Вам не кажется, что во втором случае двойная работа происходит?
конечно происходит, но это уже влияет на время инициализации класса который содержит эти агрегаты
Bers
Заблокирован
02.11.2011, 16:48     Двоеточие в конструкторе, что это? #15
Цитата Сообщение от Jupiter Посмотреть сообщение
конечно происходит, но это уже влияет на время инициализации класса который содержит эти агрегаты
Так об этом и речь!

Инициализация объекта - суть инициализация всех его данных-членов. Но не просто инициализация, а ещё и настройка.

Если инициализировать данные-члены в списках инициализации, то объект-хозяин проинициализируется быстрее.

/зы Простите... может быть я путаюсь в понятиях, но я всегда думал, что агрегат - это класс, который содержит агрегируемые элементы.

Ну то есть агрегат - это большая шняга, которая состоит из маленьких элементов.
А как по научному называются элементы из которых состоит агрегат, я что-то даже и не вспомню)
Не просвятите?
Jupiter
02.11.2011, 16:57
  #16

Не по теме:

Цитата Сообщение от Bers Посмотреть сообщение
Простите... может быть я путаюсь в понятиях, но я всегда думал, что агрегат - это класс, который содержит агрегируемые элементы.
очень может быть что в терминах запутался и я

Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
02.11.2011, 18:19     Двоеточие в конструкторе, что это? #17
Цитата Сообщение от ForEveR Посмотреть сообщение
ерез список инициализация происходит шустрее. + к тому константные данные можно инициализировать только через список.
ну и ссылки тоже:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class inc
{
    int& i_ref;
    int val;
public:
    inc(int& i, int v = 1);
    void operator () ();
};
 
inc::inc(int& i, int v)
    : i_ref(i), val(v)
{
    // i_ref = _i; -- ошибка
}
 
void inc::operator () ()
{
    i_ref += val;
}
 
int main()
{
    int i = -1;
    inc add_1(i);
    add_1();
    return i;
}
Сыроежка
Заблокирован
02.11.2011, 18:39     Двоеточие в конструкторе, что это? #18
Цитата Сообщение от Bers Посмотреть сообщение
Так об этом и речь!

Инициализация объекта - суть инициализация всех его данных-членов. Но не просто инициализация, а ещё и настройка.

Если инициализировать данные-члены в списках инициализации, то объект-хозяин проинициализируется быстрее.

/зы Простите... может быть я путаюсь в понятиях, но я всегда думал, что агрегат - это класс, который содержит агрегируемые элементы.

Ну то есть агрегат - это большая шняга, которая состоит из маленьких элементов.
А как по научному называются элементы из которых состоит агрегат, я что-то даже и не вспомню)
Не просвятите?
На мой взгляд, то, что вы говорите, является глупостью. Во-первых, внутри тела конструктора происходит не инициализация, а присваивание. То есть если вы имеете член класса, который в свою очередь имеет тип класса, то внутри тела конструктора вызывается оператор присваивания для данного члена класса. То есть сначала объект создается с помощью конструктора по умолчанию (если иное не было указано в списке инициализации), а затем для этого объекта вызывается оператор присваивания operator =.
То есть семантически выполняются совершенно разные вещи. Так что сравнивать их бессмысленно!
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.11.2011, 18:42     Двоеточие в конструкторе, что это? #19
Сыроежка, если operator= реализован по copy-swap, то имеет смысл. Хотя в этом случае всё затянется ещё на более длительное время.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2011, 18:55     Двоеточие в конструкторе, что это?
Еще ссылки по теме:

Не пойму что делает : в конструкторе C++
C++ Что означает двоеточие в наследовании конструктора?
Что значит const в конструкторе класса? C++

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
02.11.2011, 18:55     Двоеточие в конструкторе, что это? #20
Цитата Сообщение от Сыроежка Посмотреть сообщение
На мой взгляд, то, что вы говорите, является глупостью. Во-первых,
Там выше мини-тесты, которые прекрасно все отображают.
Yandex
Объявления
02.11.2011, 18:55     Двоеточие в конструкторе, что это?
Ответ Создать тему
Опции темы

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