Читайте также:
|
|
ЛЕКЦИЯ 7
ПЕРЕГРУЗКА ФУНКЦИЙ
Назначение перегрузку______________________________________________________________________ 1
Декорирование компилятором имен функций___________________________________________________ 2
Перегрузка функций_________________________________________________________________________ 2
Перегрузка конструкторов___________________________________________________________________ 3
Неоднозначность перегрузки_________________________________________________________________ 3
ПЕРЕГРУЗКА ФУНКЦИЙ
Назначение перегрузки
Перегрузка функций - это один из типов полиморфизма, обеспечиваемого C++. В C++ несколько функций могут иметь одно и то же имя. В этом случае функция, идентифицируемая этим именем, называется перегруженной. Перегрузить можно только функции, которые отличаются либо типом, либо числом своих аргументов. Перегрузить функции, которые отличаются только типом возвращаемого значения, нельзя. Перегружаемые функции дают возможность упростить программы, допуская обращение к одному имени для выполнения близких по смыслу действий.
Чтобы перегрузить некоторую функцию, нужно просто объявить, а затем определить все требуемые варианты ее вызова. Компилятор автоматически выберет правильный вариант вызова на основании числа и типа используемых аргументов. Пример:
include <iostream.h>
// прототипы перегруженных функций
int abs (int); // функция получает и возвращает целое значение
float abs (float); // функция оперирует с вещественным числом одинарной точности
double abs (double); // функция оперирует с вещественным числом двойной точности
void main () {
int mN, N = -255; float mF, F = -25.0f; double mD, D = -2.55;
mN = abs (N); // вызов перегруженной функции abs (int)
mF = abs (F); // вызов перегруженной функции abs (float)
mD = abs (D); // вызов перегруженной функции abs (double)
cout«'\n';
cout «T «N <<"| = " «mN «V;
cout «Y «F <<"| = " «mF «V;
cout «Y «D <<"| = " «mD «'V; }
int abs (int a) {
cout«"abs(int)\t";
return a < 0? -a: a; }
float abs (float a) {
cout«"abs(float)\t";
return a < 0? -a: a; }
double abs (double a) {
cout«"abs(double)\t";
return a < 0? -a: a; }
При выполнении программа выводит на экран:
abs(int) abs(float) abs(double)
|-255| = 255 |-25| = 25 |-2.55| = 2.55
Библиотека времени выполнения C++ использует три разных функции abs (), fabs () и fabsf () для вычисления абсолютного значения аргумента. Использование той или другой из них зависит от типа аргу-
Объектно-ориентированное программирование
Лекция 7
Перегрузка операторов
мента. Так, в данном примере осуществляется перегрузка функции abs (), что упрощает программу. В зависимости от переданного аргумента вызывается нужный вариант функции.
Этот пример наглядно демонстрирует, как использование перегрузки может упростить код, предоставляя программисту возможность пользоваться одной функцией, которой передаются аргументы различного типа. Разумеется, возможность использования перегрузки предъявляет повышенные требования к компилятору.
Декорирование компилятором имен функций
Чтобы реализовать концепцию перегрузки, разработчикам компиляторов C++ пришлось ввести декорирование имен. Последнее означает, что все функции в коде программы получают от компилятора имена, основываясь на имени, заданном программистом, и количестве и типах аргументов. Различные компиляторы делают это несколько отличным друг от друга образом. Здесь мы опишем, как это делает компилятор фирмы Inprise (ранее - фирма Borland).
Вначале идет символ " @ " и имя класса, затем символ " @ " и имя функции, У всех идентификаторов различается регистр букв. Затем следует последовательность символов " @q ", начиная с которой идут кодированные обозначения параметров функции. Для обозначения указателей и ссылок к кодам встроенных типов добавляются буквы " р " и "г", соответственно. Например, если дано такое определение класса: class AnyClass { public:
void SetVal (void);
void SetVal (int);
void SetVal (int*, double);
void SetVal (int&, int, float);
}
компилятор Borland C++ сгенерирует такие имена функций:
Дата добавления: 2015-11-26; просмотров: 135 | Нарушение авторских прав