Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 30.10.2011
Сообщений: 20
1

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

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

Объясните с точки зрения синтаксиса C++, что означает перечисление после двоеточия?
C++
1
OgreApp::OgreApp(void)  : mRoot(0),  mCamera(0),  mSceneMgr(0) {}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2012, 15:02
Ответы с готовыми решениями:

Странный синтаксис шаблона
Здравствуйте. Объясните пожалуйста, почему при передаче функции-шаблону какого-нибудь...

Объясните синтаксис конструктора дерева
Учитель дал "заготовку" для реализации класса дерева, непонятен вид конструктора узла дерева. ...

Вызвать конструктор производного класса без конструктора базового класса
Здравствуйте! У меня есть базовый класс треугольник и производный класс равносторонний...

Почему создатели языка C++ придумали такой странный синтаксис обращения к элементам одномерного массива?
К элементам массива можно обращаться разными способами. Обычно в квадратных скобках пишут номер...

14
137 / 126 / 14
Регистрация: 03.07.2012
Сообщений: 355
02.08.2012, 15:07 2
Это вроде бы вызываются конструкторы классов mRoot, mCamera и mSceneMgr. И в каждый из них передаются аргументы 0
1
153 / 137 / 34
Регистрация: 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;
}
В общем после двоеточия идет список инициализации данных класса
1
Каратель
Эксперт С++
6594 / 4015 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
02.08.2012, 15:13 4
Цитата Сообщение от DelphiBeginner Посмотреть сообщение
что означает перечисление после двоеточия?
список инициализации полей

Добавлено через 43 секунды
Цитата Сообщение от Intel~lect Посмотреть сообщение
классов mRoot, mCamera и mSceneMgr
это объекты
0
Эксперт С++
2122 / 1560 / 232
Регистрация: 29.05.2011
Сообщений: 3,238
02.08.2012, 15:16 5
Цитата Сообщение от Andsteadur Посмотреть сообщение
Можно так инициализировать и базовые типы:
Формально разногласия нет, так как у базовых типов в C++ тоже есть конструкторы.
0
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
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; }
Только за тем различием, что первый вариант происходит статически. Например, если нужно инициализировать объект какого-то класса, который не имеет конструктора по умолчанию, то можно использовать только первый вариант, если не создавать этот объект динамически.
0
Эксперт С++
8325 / 6077 / 604
Регистрация: 10.12.2010
Сообщений: 28,209
Записей в блоге: 27
02.08.2012, 17:39 7
Да и как я понимаю первый вариант быстрее чем второй...или нет ?
0
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
02.08.2012, 18:03 8
Avazart, на n миллисекунд да.
0
Эксперт С++
8325 / 6077 / 604
Регистрация: 10.12.2010
Сообщений: 28,209
Записей в блоге: 27
02.08.2012, 18:06 9
Avazart, на n миллисекунд да.
Ну так если у тебя std::map на 10...00 объектов то....
0
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
02.08.2012, 18:07 10
Avazart, тоже самое. Все равно map динамически заполняется.
0
Эксперт С++
8325 / 6077 / 604
Регистрация: 10.12.2010
Сообщений: 28,209
Записей в блоге: 27
02.08.2012, 18:08 11
А при подгрузке с файла или копировании ?
0
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
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);
        }
0
Эксперт С++
8325 / 6077 / 604
Регистрация: 10.12.2010
Сообщений: 28,209
Записей в блоге: 27
02.08.2012, 18:14 13
Так при чем тут map? Я о том что если объектов много то это уже существенно
0
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
02.08.2012, 18:18 14
Avazart, имею ввиду что относительная скорость будет отличаться на миллисекунды, а чему будет равна скорость вообще.
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2012, 23:10 15
Цитата Сообщение от gooseim Посмотреть сообщение
OgreApp::OgreApp(void) : mRoot(0), mCamera(0), mSceneMgr(0) {}
Такой вариант используется ещё в том случае, если mRoot, mCamera, mSceneMgr являются константами или ссылками, т.е. переменными, которые необходимо инициализировать в момент создания (выделения под них памяти). Память же под поля класса выделяется до входа в тело конструктора (тогда, когда выделяется память под объект класса), а в самом теле происходит присвоение значений полям, т.е. помещение в уже выделенную память значений. Поэтому инициализация полей класса, содержащих ссылки или константы, возможна только через список инициализаторов.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2012, 23:10

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вызов конструктора базового класса из класса-наследника
Можно ли вне списка инициализации вызвать конструктор базового класса ? class A { int a;...

Чем отличается метод класса от конструктора класса?
В ООП, чем отличается метод класса от конструктора класса? Для чего нужен конструктор класса?

Реализация конструктора класса
Здравствуйте! Хотел задать такой вопрос: Предположим, имеется класс: class Object { ...

Вызов конструктора класса
есть класс Set, и в нем есть конструктор, как с этого конструктора мне массивы перенести в метод...

Смысл конструктора класса
Добрый день! Потихоньку начинаю программировать на С++ и разибраться в чужом коде. Все бы ничего,...

Инициализация конструктора класса
инициализация конструктора класса Rectangle::Rectangle(int w, int h): itsWidth(w),...


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

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

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