|
Программирование >> Расширенная версия языка c++
36 Самоучитель C++ return 0; Как и следовало ожидать, в результате выполнения программы на экране появляется слово ложь. Упражнения 1. Следующая программа не будет компилироваться в качестве программы C++. Почему? В этой программе есть ошибка #include <io3tream> using namespace std; int main 0 f (); return 0; , void f () cout ;< Программа работать не будет ; 2. Попытайтесь объявлять локальные переменные в различных местах программы C++. Попытайтесь проделать то же с программой С, обращая внимание на то, какие объявления вызовут сообщения об ошибках. 1.7. Введение в перегрузку функций После классов, вероятно, следующей важной и необычной возможностью C++ является перегрузка функций (function ading). Перегрузка функций не только обеспечивает механизм, посредством которого в С++ достигается один из типов полиморфизма, она также формирует то ядро, вокруг которого развивается вся среда программирования на C+ + . Ввиду важности темы в данном разделе предлагается только предварительное знакомство с перегрузкой функций, которой посвящена целая глава этой книги. В C++ две или более функции могут иметь одно и то же имя, отличаясь либо типом, либо числом своих аргументов, либо и тем и другим. Если две или более функции . i: : .тмякгопос пя, говорят, что они перегружены. В C++ можно также перегружать и операторы. Однако для того чтобы понять перегрузку операторов, необходимо больше узнать о С++. Примеры Одно из основных применений перегрузки функций - это достижение полиморфизма при компиляции программ, который воплощает в себе философию - один интерфейс, множество методов. Как вы знаете, при программировании на С необходимо иметь определенное число близких по назначению функций, отличающихся только типом данных, с которыми они работают. Классический пример этой ситуации дает набор библиотечных функций С. Как ранее упоминалось в этой главе, библиотека содержит функции abs(), fabs(), которые возвращают абсолютное значение, соответственно, целого, длинного целого и числа с плавающей точкой. Однако из-за того, что для трех типов данных требуется три типа функции, ситуация выглядит более сложной, чем это необходимо. Во всех трех случаях возвращается абсолютная величина числа, отличие только в типе данных. В то же время, программируя на вы можете исправить эту ситуацию путем перегрузки одного имени для трех типов данных так, как показано в следующем примере: ttinclude <iostreaMt> using namespace std; , , .,., Перегрузка () тремя способами int abs(int n) ; . V - V long abs (long n) ; . . double abs(double n); v г int raainO - cout Абсолютная величина -10: abs (-10) \n/n ; cout Абсолютная величина -lOL: abs (-10L) \n/n ; cout Абсолютная величина -10.01: abs (-10.01) \n/n ; return 0; li <-!; : , ----- Перегруженные КЦИИ позволяют упростить программы, допуская обращение к одному имени для выполнения близких по смыслу действий. Перегрузить функцию очень легко: просто объявите и определите все требуемые варианты. Компилятор автоматически выберет правильный вариант вызова на основании числа и/или типа используемых в функции аргументов. 38 Самоучитель , , €++ II abs {) для целых ., > / ir . . , f,>-t-i;: int abs (intn) , \ ..-,-1 -W-S: cout B целом abs()\n ; return n<0 ? -n: n; {} для длинных це1х long abs (long n) cou << В длинном целом abs()\n ; ; . return n<0 ? -n: n; s() для вещественных двойной точности double abs (doiable n) cout B вещественном abs () двойной точное \n ; return 0 ? -n: n; J . Как можн тить, в программе задано три функции abs(), своя для каждого типа данных. Внутри in() функция abs() вызывается с тремя аргументами разных типов. Компилятор автоматически вызывает правильную версию abs(), основываясь на используемом в аргументе типе данных. В результате работы программы на экран выводится следующее: В целом ;Уои О . : Абсолютная величина -10: 10 i - . В длинном целом abs ( ) Абсолютная величина -10L: 10 В вещественное () двойной точности - - Абсолютная величина -10.01: 10.01 Хотя этот пример достаточно прост, ценность перегрузки функций он все же демонстрирует. Поскольку одно имя используется для описания основного набора действий, искусственная сложность, вызванная тремя слабо различающимися именами, в данном случае abs(), labs() и fabs(), устраняется. Теперь вам необходимо помнить только одно имя - то, которое описывает общее действие. На компилятор возлагается задача выбора соответствующей конкретной версии вызываемой функции (а значит и метода обработки данных). Это имеет лавинообразный эффект в вопросе снижения сложности программ. В данном случае, благодаря использованию полиморфизма, из трех имен получилось одно. Хотя использование полиморфизма в этом примере довольно тривиально, вы, должно быть, уже поняли, что для очень больших программ подход один интерфейс, множество методов может быть очень эффективным.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |