Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/153: Рейтинг темы: голосов - 153, средняя оценка - 4.83
 Аватар для Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203

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

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

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

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

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

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

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

Как я понял:

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

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

и

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

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

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

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

и

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

?


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

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

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

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

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

Не по теме:

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

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

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

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

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

Ну то есть агрегат - это большая шняга, которая состоит из маленьких элементов.
А как по научному называются элементы из которых состоит агрегат, я что-то даже и не вспомню)
Не просвятите?
На мой взгляд, то, что вы говорите, является глупостью. Во-первых, внутри тела конструктора происходит не инициализация, а присваивание. То есть если вы имеете член класса, который в свою очередь имеет тип класса, то внутри тела конструктора вызывается оператор присваивания для данного члена класса. То есть сначала объект создается с помощью конструктора по умолчанию (если иное не было указано в списке инициализации), а затем для этого объекта вызывается оператор присваивания operator =.
То есть семантически выполняются совершенно разные вещи. Так что сравнивать их бессмысленно!
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
02.11.2011, 18:42
Сыроежка, если operator= реализован по copy-swap, то имеет смысл. Хотя в этом случае всё затянется ещё на более длительное время.
0
Заблокирован
02.11.2011, 18:55
Цитата Сообщение от Сыроежка Посмотреть сообщение
На мой взгляд, то, что вы говорите, является глупостью. Во-первых,
Там выше мини-тесты, которые прекрасно все отображают.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.11.2011, 18:55
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru