![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
DissDoc |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 13.7.2006 Репутация: нет Всего: нет |
Собственно заинтересовался я одной деталью. Например берем MFC ну или VCL . Да без разницы, берем еще какой-нить API.
Так вот. Определяем любой класс и берем какую-нить функцию. В итоге видим, в функцию можно писать различные параметры. Как это реализуется? Т.е. для наглядности
И мы в эту функцию можени ничего не писать, можем int записать и т.д. Вначале думал, что шаблонами реализуется.. Но в функции можно писать как 1 переменную, так и больше одной ![]() Что это за технология или может я не все знаю о классах? |
|||
|
||||
EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Может перегруженные констукторы
![]() -------------------- <удалено администрацией форума> |
|||
|
||||
DissDoc |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 13.7.2006 Репутация: нет Всего: нет |
Я не совсем понял, это вопрос или ответ?
![]() |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Еще есть вариант (правда, как правило, хуже, чем перегрузка): функции с параметрами по умолчанию
-------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 2 Всего: 95 |
DissDoc
Кажись, тут имеет место быть обычная перегрузка функций:
Оно? Или я что-то недопонял? -------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
ama_kid, я так же понял. ИМХО оно
![]() -------------------- <удалено администрацией форума> |
|||
|
||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Скорее всего не о классах, а о самом С++. Причем это область знания относится чуть ли не к базовым понятиям, а именно о перегрузке функций, поскольку могут перегужаться не только member function, но free function
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
DissDoc |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 13.7.2006 Репутация: нет Всего: нет |
Спасибо за помощь. ) Буду книжки опять перечитывать. Очень уж этот момент заинтересовал!
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Еще вы забыли упомянуть о действительно переменном числе параметров, т.е. когда в списке параметров стоит ... Тогда функция сама (по каким-то внешним соглашениям) должна разбираться со своими параметрами. Вот, скажем, prinf именно так устроена: после строки формата может идти любое число параметров любого типа...
-------------------- ... |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
Earnest, а как это реализовано? т.к. читал книгу по C, но там этого не было.
|
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
Daevaorn, не, я понимаю, как это на асме сделать. А на сишнике? Пример плз.
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
В каком смысле как реализовано?
Функции формата cdecl в отличие от pascal не очищают стек сами, это делает вызывающий код, который точно знает, сколько параметров он засунул в стек. А как функция разбирается с переданными параметрами - это от нее зависит, как напишешь. printf, например, разбирает строку формата и каждый следующий аргумент из стека интерпретирует в соответствии с очередным дескриптором. Поэтому, если ошибешься в передаче аргументов, то можно получить ерунду. Причем особенно это критично в scanf, где параметры изменяются... там и проехаться по чужой памяти можно. Именно поэтому переменный список аргументов небезопасен (компилятор ничего не контролирует), а за все отвечает программист. Собственно, других случаев полезного использования переменного списка аргументов кроме форматного ввода\вывода, я привести не могу. Хотя могут быть и другие варианты соглашения об аргументах: скажем, передаем список параметров одного типа, завершающихся нулем. А для разбора параметров внутри функции есть макросы va_arg (они обеспечивают продвижение по стеку и приведение переменных к нужному типу). -------------------- ... |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
А можно как раз пример такой ф-ии с переменным числом параметров? Просто сам принцип понял, но хотелось бы увидеть реализацию.
Т.к. скоро опять придется писать на сишнике, так что хочется его получше узнать =\ |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Очень хороший и жизненный пример: http://www.and.org/texts/simple_printf.c ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |