Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы(С++).doc
Скачиваний:
6
Добавлен:
17.11.2019
Размер:
385.54 Кб
Скачать

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

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

Язык С++ позволяет создать несколько разных функций с одинаковым именем (функции-тезки), при этом функции отличаются:

  • либо типом;

  • либо числом своих аргументов;

  • либо типом и числом аргументов.

Если две или более функций имеют одинаковое имя, говорят, что они перегружены.

Существует условие, которому обязаны удовлетворять функции-тезки – функции должны отличаться друг от друга списком параметров, а именно:

  • типом или количеством параметров;

  • тем и другим одновременно.

Например, рассмотрим следующие объявления перегруженных функций:

Int myFunction (int, int);

Int myFunction (long, long);

Int myFunction (long);

Функция myFunction перегружена с тремя различными списками параметров: первая и вторая отличаются типами параметров, а третья – типом и количеством.

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

Механизм перезагрузки функций необходим, например, тогда, когда требуется создать функцию, которая удваивает любое передаваемое ей значение. При этом необходимо иметь возможность передавать ей значения типа int, long, float или double. Без перегрузки функций пришлось бы создавать четыре различные функции:

int DblInt (int);

long DblLongt (long);

float DblInt (float);

double DblDouble (double);

С помощью же перегрузки функций достаточно использовать следующие объявления:

int Dbl (int); // объявление функции удвоения целых чисел

long Dbl (long); // объявление функции удвоения чисел типа long

float Dbl (float); // объявление функции удвоения чисел типа float

double Dbl (double); // объявление функции удвоения чисел типа double

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

Вышесказанное рассмотрим на примере. Здесь функция Dbl() перегружается для приема параметров четырех типов.

// полиморфизм функций

#include <iostream>

using namespace std;

// прототипы перегруженных функций

int Dbl (int);

long Dbl (long);

float Dbl (float);

double Dbl (double);

int main ()

{// инициализация переменных

int myInt = 6500;

long myLong=65000;

float myFloat=6.5F;

double myDouble=6.5e20;

// объявление переменных для хранения удвоенного значения

int doubledInt;

long doubledLong;

float doubldedFloat;

double doubledDouble;

// вывод на экран значений переменных

cout <<"myInt: "<<myInt<<"\n";

cout<<"myLong: "<<myLong<<"\n";

cout<<"myFloat: "<<myFloat<<"\n";

cout<<"myDouble: "<<myDouble<<"\n";

// вызов перегруженных функций и

// присвоение переменным возвращаемых ими значений

doubledInt = Dbl (myInt);

doubledLong = Dbl (myLong);

doubldedFloat = Dbl (myFloat);

doubledDouble = Dbl (myDouble);

//вывод значений

cout<<"doubleInt: "<<doubledInt<<"\n";

cout<<"doubleILong: "<<doubledLong<<"\n";

cout<<"doubleFloat: "<<doubldedFloat<<"\n";

cout<<"doubleDouble: "<<doubledDouble<<"\n";

return 0;

}

//определение функций

int Dbl (int original)

{

return 2*original;

}

long Dbl (long original)

{

return 2*original;

}

float Dbl (float original)

{

return 2*original;

}

double Dbl (double original)

{

return 2*original;

}

Результат:

myInt: 6500

myLong: 65000

myFloat: 6.5

myDouble: 6.5е+020

doubleInt: 13000

doubleILong: 130000

doubleFloat: 13

doubleDouble: 1.3е+021