Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Декорирование компилятором имен функций

Читайте также:
  1. V Производные обратных тригонометрических функций
  2. Алгоритм работы библиотечных функций malloc/free языка С
  3. Аналитическое выравнивание рядов динамики. Типы развития и соответствующие им уравнения функций.
  4. В. Расстройства интеграции психических функций
  5. Вегетативные рефлексы и центры регуляции вегетативных функций
  6. Возрастание и убывание функций.
  7. Возрастание и убывание функций.

ЛЕКЦИЯ 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 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.007 сек.)