57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
1

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

02.11.2011, 14:39. Показов 27292. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пример - конкретно из книги дейтела, вопрос вызывает двоеточие после конструктора, если оно позвляет производить инициализацию - то почему не делать бы этого в теле. Было бы очень хорошо если бы кто-нибудь ткнул носом в мануал по возможным вариантам использования этой вундервафли.
C++
1
String::String( const char *s):length( ( s != 0) ? strlen(2) : 0){/*...*/}
Поиском по форуму не нашел, если было - прошу понять, простить (с)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2011, 14:39
Ответы с готовыми решениями:

Двоеточие в конструкторе
class A { public: A(): }; Что означает двоеточие и что туда надо писать?

Синтаксис С++. Двоеточие в конструкторе
struct busy_head { size_t size; busy_head(size_t size) : size(size) { }; // Как...

Поясните пожалуйста что означает двоеточие и то что идет после него
В 4 строчке после параметра в скобочках нету ";" или же тела функции, что не сходится с моим...

Что это за знак >> прочитал что это сдвиг вправо? что он делает
int d=6, c=5,f; f = d >> c; cout<< f; вывод 0

23
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.11.2011, 14:39 2
Drus, Cписок инициализации.
0
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
02.11.2011, 14:53  [ТС] 3
Нашел темы, почитал. Возникла каша в голове.

Как я понял:

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

Вот какой вопрос гложет: а есть ли разница инициализации списком и инициализации в теле конструктора, и какой вариант предпочтительнее?
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.11.2011, 15:00 4
Drus, Через список инициализация происходит шустрее. + к тому константные данные можно инициализировать только через список.
2
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
02.11.2011, 15:01  [ТС] 5
спасибо огромное!
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.11.2011, 15:01 6
http://liveworkspace.org/code/... 5452fee539

и

http://liveworkspace.org/code/... 5f6e1f6b70

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

http://liveworkspace.org/code/... db70c04019
1
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
02.11.2011, 15:39 8
Цитата Сообщение от ForEveR Посмотреть сообщение
Через список инициализация происходит шустрее
думаю что слово "шустрее" неуместно, список инициализации просто инициализирует перед тем как войти в тело конструктора
1
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
02.11.2011, 15:39  [ТС] 9
Цитата Сообщение от talis Посмотреть сообщение
параметры конструктора этого члена
сильно помогло в осознании, спс. Сразу как-то не совместил что инициализация и есть конструктор, вот и не понимал смысла
0
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.11.2011, 15:40 10
Почитайте про
Цитата Сообщение от ForEveR Посмотреть сообщение
Захват Ресурса Есть Инициализация (RAII)
1
Заблокирован
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/... 55b514beff
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
02.11.2011, 16:31 12
Цитата Сообщение от Bers Посмотреть сообщение
Тест1 и тест2 наглядно демонстрируют, что инициализация агрегата через инициализацию его агрегированных данных выполняется шустрее, потому что использует минус одно действие.
да хоть десять инициализаций - все десять мемберов проинициализируются за 10N, но это никак не влияет на само N
все это в теории конечно ибо состояние системы в целом разное в каждый момент времени
0
Заблокирован
02.11.2011, 16:35 13
Цитата Сообщение от Jupiter Посмотреть сообщение
да хоть десять инициализаций - все десять мемберов проинициализируются за 10N, но это никак не влияет на само N
все это в теории конечно ибо состояние системы в целом разное в каждый момент времени
Есть разница:

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

и

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

?


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

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

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

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

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

Не по теме:

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

0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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;
}
0
Заблокирован
02.11.2011, 18:39 18
Цитата Сообщение от Bers Посмотреть сообщение
Так об этом и речь!

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

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

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

Ну то есть агрегат - это большая шняга, которая состоит из маленьких элементов.
А как по научному называются элементы из которых состоит агрегат, я что-то даже и не вспомню)
Не просвятите?
На мой взгляд, то, что вы говорите, является глупостью. Во-первых, внутри тела конструктора происходит не инициализация, а присваивание. То есть если вы имеете член класса, который в свою очередь имеет тип класса, то внутри тела конструктора вызывается оператор присваивания для данного члена класса. То есть сначала объект создается с помощью конструктора по умолчанию (если иное не было указано в списке инициализации), а затем для этого объекта вызывается оператор присваивания operator =.
То есть семантически выполняются совершенно разные вещи. Так что сравнивать их бессмысленно!
0
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.11.2011, 18:42 19
Сыроежка, если operator= реализован по copy-swap, то имеет смысл. Хотя в этом случае всё затянется ещё на более длительное время.
0
Заблокирован
02.11.2011, 18:55 20
Цитата Сообщение от Сыроежка Посмотреть сообщение
На мой взгляд, то, что вы говорите, является глупостью. Во-первых,
Там выше мини-тесты, которые прекрасно все отображают.
0
02.11.2011, 18:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2011, 18:55
Помогаю со студенческими работами здесь

Что означает двойное двоеточие в коде
Что в с++ значит вот это ::

Что означает двоеточие в наследовании конструктора?
При изучении ООП в рамках языка c++ столкнулся с интересной формой обьявления конструктора объекта:...

Для чего нужен оператор двоеточие, если два двоеточия - это оператор расширения области видимости
для чего нужен оператор двоеточие ( : ), если два двоеточия( :: ) - это оператор расширения области...

Что означает двойное двоеточие в vector<int>::iterator it ?
Никак не могу понять как взаимоувязаны две сущности: контейнеры и итераторы. ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru