Функции. Основные принципы структурной методологии. Принцип формальности. Принцип иерархического упорядочивания, страница 15

В «старом» С все имена функций должны быть уникальны в одном проекте. Это плохо и неудобно при работе с функциями, которые выполняют одинаковые или похожие действия с разными типами данных. Классический пример этого – стандартные функции abs(), labs(), fabs(), которые возвращают абсолютное значение, соответственно, целого, длинного целого и вещественного типов.

В С++ можно определить с одним и тем же именем несколько функций, которые отличаются типами параметров и реже их количеством. Тогда говорят, что функции перегружены. Под перегрузкой понимается создание нескольких прототипов и определений функций, имеющих одинаковое имя.

Рассмотрим пример программы, в которой перегружаются две функции с равным числом аргументов и имеющие одинаковые имена. Первая функция  int func (int a, int b) определяет сумму двух целых чисел a и b, вторая - float func (float a, float b) – разность двух чисел с плавающей точкой:

#include <iostream.h>

int func (int a, int b);           //прототип функции вычисления суммы

float func (float a, float b);  //прототип функции вычисления разности

//-------------------------------------------------------------void main ()

{int a=25, b=40;

float c=2.45f, d=6.15f;

cout <<  “\n summa=” <<  func (a,b);    //вызов функции с аргументами целого типа

cout <<  “\n raznost=” <<  func (c,d);    //вызов функции с аргументами типа float

}

//-------------------------------------------------------------int func(int a, int b)           //определение функции вычисления суммы

{return (a+b);

}

//-------------------------------------------------------------float func(float a, float b)     //определение функции вычисления разности

{return (a-b);

}

А теперь рассмотрим пример перегрузки семейства функций, имеющих разное количество параметров.

Функции выполняют вывод на экран символа (заданного в виде аргумента или определенного в функции)  некоторое количество раз (заданное в качестве аргумента или определенное в функции):

#include <iostream.h>

void repchar();                  //прототип функции для вывода символа ‘*’  45 раз

void repchar(char);             //прототип функции для вывода  символа-аргумента  45 раз

void repchar(char, int);    //прототип функции для вывода  символа-аргумента  заданное                                                        //через второй аргумент количество  раз

//-------------------------------------------------------------int main()

   {

repchar();                           //вызов функции для вывода символа ‘*’  45 раз

repchar('=');                      //вызов функции для вывода символа ‘=’  45 раз

repchar('+', 30);                   //вызов функции для вывода символа ‘+’  30 раз

return 0;

}

//-------------------------------------------------------------void repchar()                       //определение функции вывода символа ‘*’  45 раз

{

for(int j=0; j<45; j++) 

cout << '*';         

cout << endl;

}

//-------------------------------------------------------------void repchar(char ch)              //определение функции вывода символа-аргумента  45 раз

{

for(int j=0; j<45; j++) 

cout << ch;          

cout << endl;

}

//-------------------------------------------------------------void repchar(char ch, int n)       //определение функции вывода  символа-аргумента  заданное      {//через второй аргумент количество  раз

for(int j=0; j<n; j++)  

cout << ch;          

cout << endl;

   }

Результат работы:

*********************************************

=============================================

++++++++++++++++++++++++++++++

Перегрузка функции циклического сдвига аргумента влево:

#include <iostream.h>

int rotate (int i);       

long rotate (long i);       

//-------------------------------------------------------------int main()

{

int a; a=0x8000;