Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Перегрузка функций  (Прочитано 19301 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Romario
Гость
« : 26-11-2003 01:56 » 

Доброго времени суток всем и будем знакомы! =)

Учу в универе С++, но как и везде толкового объснения не дождёшься, лишь бы рассказать и всё... поэтому возникает много вопросов Улыбаюсь Вот один из них:

Что за перегрузка функций(или просто перегрузка, не помню..), как это понять, зачем это нужно и т.д. Улыбаюсь
Записан
Xeysan
Гость
« Ответ #1 : 26-11-2003 05:15 » 

Если на пальцах - то две и/или больше функции с разными списками аргументов ( ну есть еще правила устранения неоднозначностей и тд )
Например:
Код:
// print - печать аргумента
     void  print( const char* string );
     void  print( int digit );
     void  print( double digit );
     int   print( int digit );          // Неправильно, возр. значение не учитывается
« Последнее редактирование: 22-11-2007 15:39 от Алексей1153++ » Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 26-11-2003 08:33 » 

Пергрузка- это один из самых сложных моментов C++. Функции могут иметь одинаковые имена, но разные типы аргументов и их количество. Есть правила перегрузки функций, то есть правила выбора нужной ф-ции.
Самый простой пример.
int add(int& a, int& b)
{
return a+b;
};

float add(float& a, float& b)
{
return a+b+10;
}

int main(....)
{
float fa=1.0, fb= 2.0, fc;
int ia=1, ib =2, ic;

fc = add(fa,fb);//вызов float add(float& a, float& b)  fc==3.0
ic = add(ia,ib);//вызов int add(int& a, int& b) ic==13

}

Правила перегрузки ф-ций, то есть выбора нужной ф-ции приведены в книге Б.Страуструпа "Язык программирования С++" и в Стандарте на язык. Обращаю внимание, что возвращаемое значение не принимается во внимание при выборе ф-ции, то есть перегрузка только по возвращаемому значению запрещена.
Записан
Romario
Гость
« Ответ #3 : 26-11-2003 22:12 » 

Абсолютно ничего не понял... именно что это такое я не услышал, особенно зачем это нужно... :oops:
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #4 : 26-11-2003 23:26 » 

Представь себе, что есть функция, которая работает только с числами от 0 до 255.  Т.е. с кодом символов.
Она определяет длину массива, колличество слов и т.д.
Тривиальная задача, которая работает для подготовки статей к публикации в газету.

Но в связи с этим язык, с которым она работает фиксирован по таблице текущего языка в ОС.

Ты имеешь задачу взять готовую библиотеку и переделать на работу с Юникодом.

Выход - все зависимые от char функции перегрузить, ведь кода библиотеки нету, а она нужна.
Тогда пишется прототип функции которая работает с типом данных несущим код символа в 2-х байтах...

Была

void Calc(char * Text);

стала

void Calc(TCHAR * Text);

т.е. ты дал ей тоже название что и раньше....

Написанная программа получая код в юникоде и получив код в юникоде расчитает все для 2-х байтных кодов автоматически - если вызовет функцию с 2-х байтным текстом, и тебе менять придется минимум кода.
Записан

А птичку нашу прошу не обижать!!!
Migmile
Помогающий

ru
Offline Offline

« Ответ #5 : 27-11-2003 13:41 » 

Я бы сказал так: иногда желательно, чтобы функция делала разные вещи, в зависимости от типа передаваемых ей параметров. В примере, приведенном SlavaI-ой функция складывает 2 ЦЕЛЫХ числа.
int add(int& a, int& b)
{
return a+b;
}
Но тогда для складывания НЕЦЕЛЫХ чисел придется писать другую функцию?
  int add_float(float& a, float& b)
  {
   return a+b;
  }
НЕУДОБНО и НЕКРАСИВО!
В С++ для этого и существуетпонятие "Перегрузка функций". Ты можешь создать ЕЩЕ одну или более функций с тем-же именем. Делать эти функции могут одно  и то-же или совершенно разное. Главное - чтобы список параметров этих функций отличался бы хотя-бы одними параметром
Цитата

float add(float& a, float& b)
{
return a+b+10;
}
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 27-11-2003 15:38 » 

Дело даже не в "некрасивости", а скорее в универсальности использования имени.
Другой пример: часто приходится инициаллизировать объекты, причём параметры могут быть различны и различаться по типу например:

BOOL Init(CString stPhone) { ... } // телефон представлен в виде строки 12-34-56

BOOL Init(DWORD dwPhone) { ... } // телефон представлен в виде числа 123456

тогда одна функция будет вызвана напр. при вводе данных юзером - строка, а другая при загрузке данных из базы данных или файла - число. В обоих случаях вызывается функция с именем Init.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #7 : 27-11-2003 16:18 » 

ИМХО! ИМХО! ИМХО! ИМХО! ИМХО! Критика и ругань по поводу написанного ниже принимается и приветствуется!
--------------------------------------------------------------------------------------
Romario, в конце концов, все идет из дизайна.

Cравни два кода:
Код:
int iadd(int, int);
float fadd(float, float);
double dadd(double, double);
и
Код:
int add(int, int);
float add(float, float);
double add(double, double);

Почему используют второй вариант? Он что, намного проще? Да нет, конечно.
Его используют просто потому, что в обыденной жизни мы привыкли говорить: "Поверни велосипед", "Поверни автомобиль", "Поверни оглобли"( Улыбаюсь ), и, в зависимости от параметра, слово "поверни" скрывает за собой совершенно разный набор действий (т.е. мы перегружаем функцию "поверни"!). Это для человека намного естественнее (а значит - и красивее!), чем говорить "Велосипедно_поверни велосипед", "Автомобильно_поверни автомобиль", или "Оглобельно_поверни оглобли". А делая то, что естественно (пусть психологи меня поправят), человек с меньшей вероятностью допускает неосознанные ошибки.

Таким образом, перегрузка функций ведет к основной цели ВСЕХ вновь появляющихся методологий программирования: сделать так, чтобы человек с прежними способностями мог создать более сложную программу, допустив при этом меньшее количество ошибок!
« Последнее редактирование: 22-11-2007 15:42 от Алексей1153++ » Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 28-11-2003 10:17 » 

Цитата: Sashok
сделать так, чтобы человек с прежними способностями мог создать более сложную программу, допустив при этом меньшее количество ошибок!


Золотые слова! Это цель всех технических наворотов в программировании, от которых юзеру не тепло и не холодно. Без них мы бы до сих пор писали бы проги длинной в несколько километров начиная BEGIN и закачивая END STOP. Если не того хуже ...
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Romario
Гость
« Ответ #9 : 30-11-2003 00:53 » 

Более менее что-то вырисовывается, спасибо... Короче говоря это 2 или более функций с одинаковым именем, одинаковыми действиями, но отличающиеся лишь разными типами данных, подаваемых на вход этой функции  Я шокирован!
Записан
Vorlon
Гость
« Ответ #10 : 30-11-2003 07:41 » 

Romario, не совсем так.
У перегруженных функций одинаковы только названия, все остальное по твоему усмотрению.
Записан
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #11 : 30-11-2003 17:35 » 

Romario, формально можно в перегруженных функциях помещать ЛЮБЫЕ действия, а не только одинаковые. Просто представим себе, что int add(int,int); действительно складывает числа, а float add(float,float); - форматирует диск( :?:  :!: ). Допустимо ли это? Формально, ДА! ДА!!! Однако, хорошо ли это? Безусловно, нет. Поэтому утверждение насчет одинаковых действий - это не требование, а хороший стиль.
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
sss
Специалист

ru
Offline Offline

« Ответ #12 : 01-12-2003 07:49 » 

Блин,во гоните.
Скажите ему наконец,
что компилятор просто подставляет примерно так

format(int)    = formati4(int)
format(char) = formatс1(int)

и все ...
Записан

while (8==8)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 01-12-2003 08:08 » 

Чего?  Я шокирован!

Что значит "примерно так", он что может "примерно не так" подставить?
А как он такое подставит?

format(CMyClass1)
format(CMyClass2)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #14 : 01-12-2003 08:39 » 

Цитата: sss
Блин,во гоните.
Скажите ему наконец,
что компилятор просто подставляет примерно так

format(int)    = formati4(int)
format(char) = formatс1(int)

и все ...
К заданному вопросу это не имеет никакого отношения. Вопрос-то был не о том, что компилятор подставит и как построит таблицу имен, а о том, что такое перегрузка и "особенно зачем это нужно... "
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
sss
Специалист

ru
Offline Offline

« Ответ #15 : 01-12-2003 08:40 » 

ха, посмотри отчет линкера. Я просто не помню наизусть. Правила разъименования зависят от компилятора
Записан

while (8==8)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #16 : 01-12-2003 08:54 » 

Да я про это:

Код:
format(char) = formatс1(int)

не думаю что он вместо char - int делает. Или это опечатка? А про остальное Sashok сказал.
« Последнее редактирование: 22-11-2007 15:42 от Алексей1153++ » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
sss
Специалист

ru
Offline Offline

« Ответ #17 : 01-12-2003 09:06 » 

опечатка, ладно не сердитесь Отлично
Записан

while (8==8)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 01-12-2003 09:18 » 

Сорри забыл смайлики вставить :oops: , ессно всё с  Ага  и  Улыбаюсь
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Romario
Гость
« Ответ #19 : 04-12-2003 22:36 » 

Спасибо ещё раз... ждите новых вопросов  Ага
Записан
Romario
Гость
« Ответ #20 : 11-12-2003 23:19 » 

Не знал знал куда это написать... продолжу тут (сорри если что Улыбаюсь)
Есть ли книги у Вас какие-нить в архиве по С++, чтобы чётко объяснялись понятия инкапсуляция, наследование, абстракция данных и т.д.. а то сессия на носу... нужна книга хорошая. Заранее благодарен Улыбаюсь
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #21 : 11-12-2003 23:35 » 

Romario, посмотри в разделе "ФАЙЛЫ" на весельчаке. Обрати внимание на это:
Design components with the C++ STL
C++. Бархатный путь
Объектно-ориентированный анализ и проектирование с примерами на С++
Thinking in C++, Volume 1, 2nd Edition
Thinking in C++, Volume 2: Standard Libraries & Advanced Topics
Записан

Странно всё это....
Romario
Гость
« Ответ #22 : 16-12-2003 22:52 » 

Возник такой же вопрос про виртуальные функции и полные вирт. функции. Что, зачем, как, почему? Улыбаюсь))
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #23 : 17-12-2003 00:28 » 

Цитата
Возник такой же вопрос про виртуальные функции и полные вирт. функции. Что, зачем, как, почему? ))
Первым делом установи себе MSDN.
Вот тебе пример, как раз из него:
Код:
#include <iostream>
using namespace std;
// Declare a base class.
class Base
{
public:
    virtual void NameOf();          // Virtual function.
            void InvokingClass();   // Nonvirtual function.
};

// Implement the two functions.
void Base::NameOf()
{
    cout << "Base::NameOf\n";
}

void Base::InvokingClass()
{
    cout << "Invoked by Base\n";
}

// Declare a derived class.
class Derived : public Base
{
public:
    void NameOf();          // Virtual function.
    void InvokingClass();   // Nonvirtual function.
};

// Implement the two functions.
void Derived::NameOf()
{
    cout << "Derived::NameOf\n";
}

void Derived::InvokingClass()
{
    cout << "Invoked by Derived\n";
}

int main()
{
    // Declare an object of type Derived.
    Derived aDerived;
    // Declare two pointers, one of type Derived * and the other
    //  of type Base *, and initialize them to point to aDerived.
    Derived *pDerived = &aDerived;
    Base    *pBase    = &aDerived;
    // Call the functions.
    pBase->NameOf();           // Call virtual function.
    pBase->InvokingClass();    // Call nonvirtual function.
    pDerived->NameOf();        // Call virtual function.
    pDerived->InvokingClass(); // Call nonvirtual function.
}
То что будет на экране
Derived::NameOf
Invoked by Base
Derived::NameOf
Invoked by Derived
« Последнее редактирование: 22-11-2007 15:45 от Алексей1153++ » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #24 : 17-12-2003 11:05 » 

Цитата: Romario
Возник такой же вопрос про виртуальные функции и полные вирт. функции. Что, зачем, как, почему? Улыбаюсь))

Mfcer__, это только половина вопроса. Мне кажется что товаришь, под "полные вирт. функции", имел ввиду абстрактные классы. Т.е., в базовом классе задается прототип виртуальной ф-ии, но нет самой тела ф-ии, а в производных нужно эту ф-ию перегрузить и реализовать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #25 : 17-12-2003 11:43 » 

Цитата

Первым делом установи себе MSDN.


А вот в этом я совершенно не уверен. У меня он например уже не стоит, только Platform SDK, DDK. А по C++ нужно взять книжку Страуструпа, она есть в PDF формате на сайте.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #26 : 17-12-2003 12:49 » 

Romario,  Ты задаёшь вопросы в форуме, которым у Страуструпа посвящены главы! По-маленьку начинай сам читать. А если что не понятно будет - тогда обращайся.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #27 : 17-12-2003 17:16 » 

Romario, вот тебе подсказка. Прежде всего, разберись, для чего нужны абстрактные классы, в чем их смысл и как они, исходя из этого смысла должны быть устроены, как бы ты их сам устроил, если бы создавал язык. Пригодится! А уж потом переходи к виртуальным функциям - все станет ясно. Заодно обрати внимание на два абсолютно разных термина - overloading и overriding. Будут вопросы - задавай.
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
Romario
Гость
« Ответ #28 : 17-12-2003 22:47 » 

Mfcer__,
Для начала, что такое MSDN

Ушёл читать Страуструпа Улыбаюсь
Записан
Xeysan
Гость
« Ответ #29 : 17-12-2003 22:53 » 

Microsoft Developer Network - проще боооольшая такая справочная система.
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines