Программирование >>  Дополнительные возможности наследования 

1 ... 31 32 33 [ 34 ] 35 36 37 ... 265


Лисшине 5.8. Полиморфизм функциО

Листинг 5.8. Пример полиморфизма функций

#include <iostream.h>

int Double(int); long Double(long); float Double(float); double Double(double);

int mainO {

int mylnt = 6500; long myLong = 65000; float myFloat = 6.5F; double myDouble = 6.5e20;

int doubledint; long doubledLong; float doubledFloat; double doubledDouble;

cout << mylnt: << mylnt << \ n ; cout << myLong; << myLong << \ n ; cout myFloat: << myFloat << \ n ; cout << myDouble: << myDouble << \ n ;

doubledint = Double(mylnt); doubledLong = Double(myLong); doubledFloat = Double(myFloat); doubledDouble = Double(myDouble);

cout << doubledint: << doubledint << \ n ; cout doubledLong: << doubledLong << \ n ; cout << doubledFloat: << doubledFloat << \ n ; cout doubledDouble: << doubledDouble << \ n

return 0;

int Double(int original) {

cout In Double(int)\ n ; return 2 * original;

long Double(long original) cout << In Double(long)\ n ;



50 51 52 53 54 55 56 57 58 59 60 61 62 63

return 2 original;

float Double(float original) {

cout In Double(float)\ n ; return 2 original;

double Double(double original) {

cout In Double(double)\ n return 2 * original;

mylnt: 6500 myLong: 65000 myFloat; 6.5 myDouble: 6.5e+20 In Double(int) In Double(long) In Double(float) In Double(double) Doubledint: 13000 DoubledLong: 130000 DoubledFloat: 13 DoubledDouble; 1.3e+21

ff*. \ Функция DoubleO перефужается для приема парамефов четырех типов: int, long, float и double. Прототипы функций занимают сфоки 6-9, а определения - сфоки 41-63.

В теле основной профаммы объявляется восемь локальных переменных. В Сфо-ках 13-16 инициализируются первые четыре переменные, а в сфоках 28-31 остальным четырем переменным присваиваются результаты передачи значений первых четырех переменных функции Double(). Обратите внимание, что по виду вызова эти функции ничем не отличаются друг от друга. Но удивительное дело: вы передаете аргумент - и вызывается нужная функция!

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

Дополнительные сведения о функциях

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



мые inline-функции и рекурсия функций. Что касается рекурсии, то это замечательное изобретение программистов время от времени позволяет решать такие проблемы, которые практически не решаются никакими другими способами.

Обычно при определении функции компилятор резервирует в памяти только один блок ячеек для сохранения операторов функции. После вызова функции управление программой передается этим операторам, а по возвращении из функции выполнение профаммы возобновляется со строки, следующей после вызова функции. Если эту функцию вызывать 10 раз, то каждый раз ваша профамма будет послушно офабатьгаать один и тот же набор команд. Это означает, что существует только одна копия функции, а не 10.

Но каждый переход к области памяти, содержащей операторы функции, замедляет выполнение профаммы. Оказывается, что, когда функция невелика (т.е. состоит лишь из одной-двух строк), можно получить некоторый выифыш в эффективности, если вместо переходов от программы к функции и обратно просто дать компилятору команду всфоить код функции непосредственно в профамму по месту вызова. Когда профаммисты говорят об эффективности, они обычно подразумевают скорость выполнения программы.

Если функция объявлена с ключевым словом inline (т.е. подставляемая), компилятор не создает функцию в памяти компьютера, а копирует ее строки непосредственно в код профаммы по месту вызова. Это равносильно вписыванию в профамме соответствующих блоков вместо вызовов функций.

Обратите внимание, что использование подставляемых функций чревато и некоторыми издержками. Если функция вызывается 10 раз, то во время компиляции в профамму будет вставлено 10 копий этой функции. За увеличение скорости выполнения программы нужно будет расплатиться размерами профаммного кода, в результате чего ожидаемого повышения эффективности программы может и не произойти.

Так какой же напрашивается вывод? Если в программе часто вызывается маленькая функция, состоящая из одной-двух строк, то это первый кандидат в подставляемые функции. Но если функция велика, то лучше воздержаться от ее многократного копирования в программе. Использование подставляемой функции демонстрируется в листинге 5.9.

Листинг 5.9. Исподьзоваппе подставдяемых хпИпе-фупкцпп

2 3 4 5 6 7 8 9

10 11 12 13 14 15

Листинг 5.9. Подставляемые inline-функции

#include <iostream.h>

inline int Double(int);

int mainO {

int target;

cout << Enter a number to work with: cin target; cout \ n ;

target = Double(target);

�1448568



1 ... 31 32 33 [ 34 ] 35 36 37 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика