Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования C++ (Практикум, часть 1).doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
5.28 Mб
Скачать

Практическое занятие 10. Перегрузка функций. Шаблоны функций Перегрузка функций

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

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

В листинге 10.1 рассмотрен пример перегрузки функций.

// Листинг 10.1. Использование перегруженных функций

#include <iostream>

using namespace std;

int square(int x) {

cout << "int ";

return x*x;

}

double square(double y) {

cout << "double ";

return y*y;

}

int main() {

// Квадрат целого числа 7

cout << square(7) << endl;

// Квадрат числа 7. типа double

cout << square(7.) << endl;

return 0;

}

Результат выполнения программы:

int 49

double 49

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

double Max(int x, int y) {

return (x > y) ? x : y;

}

int Max(int x, int y) {

return (x > y) ? x : y;

}

компилятор выдаст сообщения об ошибках:

error C2371: 'Max' : redefinition; different basic types

error C2556: 'int Max(int,int)' : overloaded function differs only by return type from 'double Max(int,int)'

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

double Max(double, double);

int Max(int, int);

char * Max(char *, char *);

int Max(char *, int);

double Max(double, double, double);

int Max(int, int, int);

Перегрузка и область видимости

Функции, объявленные в различных областях видимости (не пространствах имён), не являются перегруженными. Например:

void f4(int);

void g() {

void f4(double);

f4(10); // вызывается f4(double)

::f4(2.5); // вызывается f4(int)

}

void f4(int a) { cout << "int" << a << endl; }

void f4(double a) { cout << "double" << a << endl; }

f4(int) была бы идеальным соответствием для вызова f4(10), но в данной области видимости находится только f4(double). Операция расширения области видимости :: делает видимой только глобальную область, поэтому вызову ::f4(2.5) ставится в соответствие f4(int).

Если нужно, чтобы область действия перегрузки пересекала области видимости пространств имён, можно воспользоваться объявлением using. Объявление using вводит псевдоним для члена пространства имён в ту область видимости, в которой это объявление встречается, оно делает доступными все перегружен­ные функции с указанным именем:

void f4(int);

void g() {

void f4(double);

using ::f4; // Доступна и f4(int)

f4(10); // Вызывается f4(int)

}

Если using-объявление вводит некоторую функцию в область видимости, в которой уже имеется функция с таким же именем и таким же списком параметров, это считается ошибкой.

Правила использования перегруженных функций:

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

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

  3. Функции не могут быть перегружены, если списки их параметров отличаются только квалификатором const или использованием ссылки (например, int и const int, int и int &).

  4. Функции не могут быть перегружены, если они различа­ются только по внешнему виду при идентичности реализаций.