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

Странный синтаксис конструктора класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
DelphiBeginner
0 / 0 / 0
Регистрация: 30.10.2011
Сообщений: 20
02.08.2012, 15:02     Странный синтаксис конструктора класса #1
Объясните с точки зрения синтаксиса C++, что означает перечисление после двоеточия?
C++
1
OgreApp::OgreApp(void)  : mRoot(0),  mCamera(0),  mSceneMgr(0) {}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
02.08.2012, 15:07     Странный синтаксис конструктора класса #2
Это вроде бы вызываются конструкторы классов mRoot, mCamera и mSceneMgr. И в каждый из них передаются аргументы 0
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
02.08.2012, 15:12     Странный синтаксис конструктора класса #3
не обязательно. Можно так инициализировать и базовые типы:
C++
1
2
3
4
5
6
7
8
class Simple
{
public:
    Simple(int first, double second): i(first), d(second) {}
private:
    int i;
    double d;
}
В общем после двоеточия идет список инициализации данных класса
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.08.2012, 15:13     Странный синтаксис конструктора класса #4
Цитата Сообщение от DelphiBeginner Посмотреть сообщение
что означает перечисление после двоеточия?
список инициализации полей

Добавлено через 43 секунды
Цитата Сообщение от Intel~lect Посмотреть сообщение
классов mRoot, mCamera и mSceneMgr
это объекты
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
02.08.2012, 15:16     Странный синтаксис конструктора класса #5
Цитата Сообщение от Andsteadur Посмотреть сообщение
Можно так инициализировать и базовые типы:
Формально разногласия нет, так как у базовых типов в C++ тоже есть конструкторы.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
02.08.2012, 15:21     Странный синтаксис конструктора класса #6
DelphiBeginner,
C++
1
OgreApp::OgreApp(void)  : mRoot(0),  mCamera(0),  mSceneMgr(0) {}
Тоже самое, что
C++
1
OgreApp::OgreApp(void)  { mRoot =0;  mCamera = 0;  mSceneMgr = 0; }
Только за тем различием, что первый вариант происходит статически. Например, если нужно инициализировать объект какого-то класса, который не имеет конструктора по умолчанию, то можно использовать только первый вариант, если не создавать этот объект динамически.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,598
Записей в блоге: 17
02.08.2012, 17:39     Странный синтаксис конструктора класса #7
Да и как я понимаю первый вариант быстрее чем второй...или нет ?
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
02.08.2012, 18:03     Странный синтаксис конструктора класса #8
Avazart, на n миллисекунд да.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,598
Записей в блоге: 17
02.08.2012, 18:06     Странный синтаксис конструктора класса #9
Avazart, на n миллисекунд да.
Ну так если у тебя std::map на 10...00 объектов то....
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
02.08.2012, 18:07     Странный синтаксис конструктора класса #10
Avazart, тоже самое. Все равно map динамически заполняется.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,598
Записей в блоге: 17
02.08.2012, 18:08     Странный синтаксис конструктора класса #11
А при подгрузке с файла или копировании ?
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
02.08.2012, 18:12     Странный синтаксис конструктора класса #12
Avazart, не совсем понял, о чем вы. Посмотрите конструктор map и будет ясно:
C++
1
2
3
4
5
6
7
8
template<class _Iter>
        map(_Iter _First, _Iter _Last,
            const key_compare& _Pred)
        : _Mybase(_Pred, allocator_type())
        {   
        for (; _First != _Last; ++_First)
            this->insert(*_First);
        }
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,598
Записей в блоге: 17
02.08.2012, 18:14     Странный синтаксис конструктора класса #13
Так при чем тут map? Я о том что если объектов много то это уже существенно
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
02.08.2012, 18:18     Странный синтаксис конструктора класса #14
Avazart, имею ввиду что относительная скорость будет отличаться на миллисекунды, а чему будет равна скорость вообще.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2012, 23:10     Странный синтаксис конструктора класса
Еще ссылки по теме:

C++ Реализация конструктора класса
C++ Вызов конструктора класса
Использование конструктора класса-шаблона C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2012, 23:10     Странный синтаксис конструктора класса #15
Цитата Сообщение от gooseim Посмотреть сообщение
OgreApp::OgreApp(void) : mRoot(0), mCamera(0), mSceneMgr(0) {}
Такой вариант используется ещё в том случае, если mRoot, mCamera, mSceneMgr являются константами или ссылками, т.е. переменными, которые необходимо инициализировать в момент создания (выделения под них памяти). Память же под поля класса выделяется до входа в тело конструктора (тогда, когда выделяется память под объект класса), а в самом теле происходит присвоение значений полям, т.е. помещение в уже выделенную память значений. Поэтому инициализация полей класса, содержащих ссылки или константы, возможна только через список инициализаторов.
Yandex
Объявления
02.08.2012, 23:10     Странный синтаксис конструктора класса
Ответ Создать тему
Опции темы

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