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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 84, средняя оценка - 4.76
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
#1

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

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

Пример - конкретно из книги дейтела, вопрос вызывает двоеточие после конструктора, если оно позвляет производить инициализацию - то почему не делать бы этого в теле. Было бы очень хорошо если бы кто-нибудь ткнул носом в мануал по возможным вариантам использования этой вундервафли.
C++
1
String::String( const char *s):length( ( s != 0) ? strlen(2) : 0){/*...*/}
Поиском по форуму не нашел, если было - прошу понять, простить (с)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2011, 14:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Двоеточие в конструкторе, что это? (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
02.11.2011, 14:39 #2
Drus, Cписок инициализации.
0
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
02.11.2011, 14:53  [ТС] #3
Нашел темы, почитал. Возникла каша в голове.

Как я понял:

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

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

и

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

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

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

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

и

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

?


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

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

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

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

Ну то есть агрегат - это большая шняга, которая состоит из маленьких элементов.
А как по научному называются элементы из которых состоит агрегат, я что-то даже и не вспомню)
Не просвятите?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2011, 16:48
Привет! Вот еще темы с ответами:

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

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

Нужно произвести считывание пути к файлу с клавиатуры. Причём сделать это в конструкторе. Всё остальное корректно работает. - C++
Заранее благодарен всем кто поможет. Здравстуйте, была полностью рабочая программа которая считывает данные с файла, потом сортирует...

Не пойму что делает : в конструкторе - C++
не пойму что делает : в конструкторе.заранее спасибо за ответ. Year(int x):y(x){ if (x&lt;min || x&gt;max) throw Invalid();} Year(int...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.11.2011, 16:48
Ответ Создать тему
Опции темы

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