Программирование >>  Расширенная версия языка c++ 

1 ... 7 8 9 [ 10 ] 11 12 13 ... 227


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(), устраняется. Теперь вам необходимо помнить только одно имя - то, которое описывает общее действие. На компилятор возлагается задача выбора соответствующей конкретной версии вызываемой функции (а значит и метода обработки данных). Это имеет лавинообразный эффект в вопросе снижения сложности программ. В данном случае, благодаря использованию полиморфизма, из трех имен получилось одно.

Хотя использование полиморфизма в этом примере довольно тривиально, вы, должно быть, уже поняли, что для очень больших программ подход

один интерфейс, множество методов может быть очень эффективным.



1 ... 7 8 9 [ 10 ] 11 12 13 ... 227

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