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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
DelphiBeginner
0 / 0 / 0
Регистрация: 30.10.2011
Сообщений: 20
#1

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

02.08.2012, 15:02. Просмотров 1239. Ответов 14
Метки нет (Все метки)

Объясните с точки зрения синтаксиса C++, что означает перечисление после двоеточия?
C++
1
OgreApp::OgreApp(void)  : mRoot(0),  mCamera(0),  mSceneMgr(0) {}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2012, 15:02     Странный синтаксис конструктора класса
Посмотрите здесь:

Вызов конструктора базового класса C++
C++ Почему создатели языка C++ придумали такой странный синтаксис обращения к элементам одномерного массива?
Смысл конструктора класса C++
C++ инициализация конструктора класса
C++ Непонятный вызов конструктора класса
Вызов конструктора базового класса из класса-наследника C++
C++ Реализация конструктора класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
02.08.2012, 15:07     Странный синтаксис конструктора класса #2
Это вроде бы вызываются конструкторы классов mRoot, mCamera и mSceneMgr. И в каждый из них передаются аргументы 0
Andsteadur
153 / 137 / 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++
6547 / 3967 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.08.2012, 15:13     Странный синтаксис конструктора класса #4
Цитата Сообщение от DelphiBeginner Посмотреть сообщение
что означает перечисление после двоеточия?
список инициализации полей

Добавлено через 43 секунды
Цитата Сообщение от Intel~lect Посмотреть сообщение
классов mRoot, mCamera и mSceneMgr
это объекты
grizlik78
Эксперт С++
 Аватар для grizlik78
1890 / 1422 / 104
Регистрация: 29.05.2011
Сообщений: 2,977
02.08.2012, 15:16     Странный синтаксис конструктора класса #5
Цитата Сообщение от Andsteadur Посмотреть сообщение
Можно так инициализировать и базовые типы:
Формально разногласия нет, так как у базовых типов в C++ тоже есть конструкторы.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
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
7036 / 5213 / 258
Регистрация: 10.12.2010
Сообщений: 22,884
Записей в блоге: 17
02.08.2012, 17:39     Странный синтаксис конструктора класса #7
Да и как я понимаю первый вариант быстрее чем второй...или нет ?
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
02.08.2012, 18:03     Странный синтаксис конструктора класса #8
Avazart, на n миллисекунд да.
Avazart
 Аватар для Avazart
7036 / 5213 / 258
Регистрация: 10.12.2010
Сообщений: 22,884
Записей в блоге: 17
02.08.2012, 18:06     Странный синтаксис конструктора класса #9
Avazart, на n миллисекунд да.
Ну так если у тебя std::map на 10...00 объектов то....
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
02.08.2012, 18:07     Странный синтаксис конструктора класса #10
Avazart, тоже самое. Все равно map динамически заполняется.
Avazart
 Аватар для Avazart
7036 / 5213 / 258
Регистрация: 10.12.2010
Сообщений: 22,884
Записей в блоге: 17
02.08.2012, 18:08     Странный синтаксис конструктора класса #11
А при подгрузке с файла или копировании ?
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
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
7036 / 5213 / 258
Регистрация: 10.12.2010
Сообщений: 22,884
Записей в блоге: 17
02.08.2012, 18:14     Странный синтаксис конструктора класса #13
Так при чем тут map? Я о том что если объектов много то это уже существенно
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
02.08.2012, 18:18     Странный синтаксис конструктора класса #14
Avazart, имею ввиду что относительная скорость будет отличаться на миллисекунды, а чему будет равна скорость вообще.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2012, 23:10     Странный синтаксис конструктора класса
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alsav22
5410 / 4806 / 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     Странный синтаксис конструктора класса
Ответ Создать тему
Опции темы

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