![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
zim22 |
|
||||||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Lazin написал в одной теме, что
но получил за этот пост минус от UnrealMan с комментарием:
Но я тут книжечку почитывал и теперь у меня сомнения, прав ли был UnrealMan... Разъясните пожалуйста. Там такой пример был:
For Panda, the order of base-class initialization is:
Плюс в стандарте (пункт 12.6.5) сказано, что сначала инициализируются все переменные объекта, а только потом выполняется тело конструктора
|
||||||||
|
|||||||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
технически прав. Создание объекта - есть выделение памяти + инициализация. Инициализация - это и есть вызов конструктора. Хотя конечно когда выполняется конструктор, уже все объекты этого объекта созданы и, если предусмотрено, проинициализированы какими-то своими конструкторами. Вобщем считается, что создание объекта заканчено после вызова конструктора Добавлено через 4 минуты и 40 секунд тут по большему счету вопрос терминологии. Называть объект созданным во время вызова конструктора или НЕсозданным, я например, особого значения не придаю. Главное понимать что происходит. |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
ну вообще, я там имел ввиду, что во время выполнения тела конструктора, все члены класса уже созданы и к ним можно обращаться, ведь речь шла о использовании членов класса в конструкторе, а не о том, когда объект считается созданым
![]() |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
C точки зрения первого взгляда на тему, я сразу подумал именно о том, что имел в виду Lazin. Считать объект созданым можно, по-разному конечно, но в теле конструктора можно быть уверенным, что под объект выделена память. Например, если конструктор выглядит так:
Так что весьма спорный момент и минус ставить считаю неправильным. |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Да сначала инициализируются все переменные потом выполняется тело конструктора, так как в конструкторе можно уже обращаться к переменным класса.
zim22 что ты считаешь объектом ? Это сообщение отредактировал(а) Dem_max - 9.4.2009, 10:00 -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
не надо бросаться в крайности. Инициализация - это не только список инициализации. Объект может иметь, например некий буфер, память под который выделяется внутри конструктора. И с логической точки зрения пока этот буфер не выделен, объект еще использовать нельзя и какие-то интерфейсные функции, например, еще нельзя вызывать. Кстати, насколько я помню, создание = память + инициализация - это есть в стандарте |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Я думаю перед закрывающейся скобкой да, можно считать созданным. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Спорный какой-то вопрос. А если объект не имеет буфера и не выделяет дополнительно никакую память? То он является созданным? или нет? |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
имхо, для объекта с виртуальными функциями проще - раз в конструкторе "виртуальность не установлена", значит полностью он не создан. на простые объекты распространяется аналогия. ![]() |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
||||
|
||||
zim22 |
|
||||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
так:
************** более нагляден этот пример:
только не компилится ![]() error C3867: 'Foo::print': function call missing argument list; use '&Foo::print' to create a pointer to member Это сообщение отредактировал(а) zim22 - 9.4.2009, 10:50 |
||||||
|
|||||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Стандартизировать это сложно. Что есть инициализация? Для простых переменных - присваивание начального значения, можно вне тела конструктора. Для буферов - можно в конструкторе, у меня всегда отдельным методом Init Для полей-членов других классов там может быть вообще черт знает что... Лично для меня объект создан тогда - когда им можно пользоваться, привязывать это к конструктору - узковато вроде как получается. |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |