![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: нет Всего: 1 |
Всем привет. Есть класс:
При создании объекта в консоль напишет "A::Show()". Вопросы: Правильный ли это подход ООП? Я считаю что не рекомендуеться вызывать методы своего же класса. Поскольку метод может быть "завязан" на переменные которые ещё не инициализировались? Какие методы нельзья вызывать в конструкторе/деструкторе ? Спасибо. |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
ИМХО
В конструкторе вообще лучше ничего не вызывать. Особенно методы, которые могут привести к исключениям. Лично я конструктор использую только для начальной инициализации переменных. Даже new стараюсь не использовать - опять таки ИМХО. |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
во время выполнения тела конструктора объект уже создан и все переменные объекта инициализированы виртуальные |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
NULL - eсли об этом "не забыл" позаботиться разработчик ![]() Добавлено через 1 минуту и 54 секунды я думаю, тс, стоит прочитать о том как все это происходит в книжке, потому что по высказанному из за не подготовки можно составить ложную картину. |
|||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
выведет A Но если программируете на C++Builder и
то выведет B Аналочично при вызове виртуальных методов в деструкторе. |
||||
|
|||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
Так сначала инициализируй, а потом вызывай метод. Можно и так проинициализировать
|
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
![]()
|
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
||||
|
||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 59 |
Ни кто не запрещает вызывать виртуальные методу в конструкторе, так как поведение в этом случае четко определено стандартом. -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
вот кстати хотел ответить Лазину - как говорит Вячеслав:"использовать можно, если понимать как они себя поведут"
![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
У нельзя есть два значения : запрещено и невозможно. В вопросе мне кажется подразумевается последнее. ![]() глагол конечно лучше было в таком случае использовать "вызвать", а не "вызывать" - но это можно отнести на (плохое) качество перевода. Это сообщение отредактировал(а) mes - 19.3.2009, 15:13 |
|||
|
||||
lv151 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
C++ Standard |
|||
|
||||
lv151 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
У Шилдта - "Конструктор автоматически вызывается в момент создания объекта т.е. при его объявлении."
|
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
lv151, правильно. при объявлении объекта. но при объявлении класса.
|
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
и...?
чем одно мешает другому? |
||||
|
|||||
lv151 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
Я запутался
![]() Добавлено @ 16:05 Всё ясно, был невнимателен. Думал что:
Это сообщение отредактировал(а) lv151 - 19.3.2009, 16:31 |
|||
|
||||
azesmcar |
|
||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
если создать обьект как
Это сообщение отредактировал(а) azesmcar - 19.3.2009, 16:12 |
||||||||
|
|||||||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
azesmcar, в чем по твоему принципиальное отличие этих строк, что ты написал такую сильную разницу между ними? Между этими двумя записями нет ровно никакой разницы, исключая то, что в первом случе используется копирующий конструктор. И в первом и во втором случае, все non POD члены будут создан конструктором по умолчанию, а в POD типах будет мусор, если обратного не будет указано в списке инициализации |
|||
|
||||
lv151 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
Спасибо.
Был невнимателен. Думал что:
: var_(var) - незаметил ![]() Это сообщение отредактировал(а) lv151 - 19.3.2009, 16:33 |
|||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
vinter, не совсем,
результат
Добавлено через 1 минуту и 47 секунд если не делать new
можно так, но MyClass s() компилятор понимает как обявление прототипа функции с возвращаемым типом MyClass. |
||||||
|
|||||||
lv151 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
VC 6.0 -858993460 -858993460 Это сообщение отредактировал(а) lv151 - 19.3.2009, 16:58 |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
azesmcar, интересная особенность. Учитывая, что some_class obj; и some_class obj(); эквивалентные записи...
|
|||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
lv151, VC 6.0 не в счет.
это тоже не совсем так, ибо some_class obj(); это обявление прототипа функции с возвращаемым типом some_class не принимающей параметров.
|
||||||
|
|||||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Добавлю статью из МСДН
http://msdn.microsoft.com/en-us/library/s0wk5dy9.aspx
в стандарте пока не нашел, но не думаю что стоит искать
не думаю что МСДН врет Это сообщение отредактировал(а) azesmcar - 19.3.2009, 18:17 |
||||
|
|||||
vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
с этим никто не спорит, если у встроенных типов добавить скобки при определении, тогда она будет проинициализирована 0. У класса нет разницы, есть скобки или нет. Дефолтовый конструктор вызовется в любом случае.НО при этом он не должен обнулять внутренние pod члены. Возможно это фича студии, что при таком выражении оно обнуляет. Я бы не стал на это полагаться. Добавлено через 1 минуту и 9 секунд
оттуда же кстати |
||||
|
|||||
azesmcar |
|
||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Я бы тоже не стал, потому что нет никакой гарантии что тот кто будет использовать ваш класс - проинициализирует его со скобками. Но если мне не изменяет память Саттер говорил, что класс проинициализированный со скобками, инициализирует также все внутренние pod члены. Добавлено через 2 минуты и 20 секунд
щас GCC проверим Добавлено через 6 минут и 16 секунд
Добавлено через 10 минут и 51 секунду
ну ясно, потому что класс создан без скобок. Я попробую найти что Саттер писал по этому поводу. |
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "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. |