23. C++ Перегрузка функций

C++ Перегрузка функций

Частично перегрузку мы затронули во введении в языки C и C++, рассмотрим ее немного подробнее:

Под перегрузкой функции понимается, определение нескольких функций (две или больше) с одинаковым именем, но различными параметрами. Наборы параметров перегруженных функций могут отличаться порядком следования, количеством, типом. Таким образом перегрузка функций нужна для того, чтобы избежать дублирования имён функций, выполняющих сходные действия, но с различной программной логикой.

Например: напишем функцию сложения:

int16_t Sum(int8_t a, int8_t b) {return (a+b);}

 

В классическом C если мы захотим сложить например 2 числа типа float нам придется писать дополнительную функцию, например

double Sum_f (float a, float b) {return (a+b);}

 

В C++ можно добавить еще 1 функцию с таким именем и перегрузить первую, например так:

double Sum (float a, float b) {return (a+b);}

 

И в коде можно не задумываться о типах значений — компилятор сам подставит требуемую на основе типа передаваемых значений (и их кол-ва)

т.е. мы можем написать

//код и перегрузки
int Sum(int a, int b) {return (a+b);}
double Sum (double a, double b) {return (a+b);}

int main ()
{
//какой-то код
int d_a=2;
int d_b=2;
double c=1.5;
double  d=2.1;
cout<<"Int sum= \t"<<Sum(d_a,d_b)<<endl;//просто вывод в консоль результата
cout<<"double sum= \t"<<Sum(c,d)<<endl; //просто вывод в консоль результата
return 0;
}

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

>>Как это работает – при компиляции программы компилятор смотрит на аргументы функций и ищет функцию, наиболее близкую по синтаксису, если такой функции не найдено, то компилятор попробует использовать наиболее близкую функцию (приведя аргументы)
Например:

float Val_1=1.5;
float Val_2=2.1;

cout<<“Int sum= \t”<<Sum(Val_1,Val_2)<<endl;   //просто вывод в консоль результата
Будет выполнено приведение к большему типу (double) и вызвана перегруженная функция для double.

Правила перегрузки:

  1. Если есть точное совпадение, то используется оно
  2. Если нет функций, которые могли бы подойти с учетом преобразований, то выдается ошибка
  3. Если есть функции, подходящие с учетом преобразований
    • Расширение типов
      char, signed char, short -> int

unsigned char, unsigned short -> int/ unsigned int

float -> double

  • Стандартные преобразования (числа, указатели)
  • Пользовательские преобразования

В случае нескольких параметров нужно, чтобы выбранная функция была строго лучше остальных!!!

 

К одному из подвидов перегрузки можно отнести шаблонные функции.

Leave a Reply

Your email address will not be published. Required fields are marked *