|
Программирование >> Дополнительные возможности наследования
Лисшине 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
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |