#include
using namespace std;
2 :
const double Pi = 3.14159;
double Area(double Radius); // для круга
double Area(double Radius, double Height); // перегружено для
7: // цилиндра
8 : int main ()
{
cout « "Enter z for Cylinder, c for Circle: ";
11: char Choice = 'z';
cin » Choice;
cout « "Enter radius: ";
double Radius = 0;
cin » Radius;
17:
|
if (Choice ==
|
'z')
|
18:
|
{
cout « "Enter height: ";
double Height = 0;
cin » Height;
23:
// Вызов перегруженной версии Area для цилиндра
25: cout « "Area of cylinder is: " « Area (Radius, Height)
endl;
}
else
cout « "Area of cylinder is: " « Area (Radius) « endl;
return 0;
}
32:
// для круга
double Area(double Radius)
{
36: return Pi *Radius * Radius;
}
// перегружено для цилиндра
double Area(double Radius, double Height)
41:
|
{
|
42:
|
// повторноеиспользование версии для площади круга
|
return 2 * Area(Radius) + 2 * Pi * Radius * Height;
}
|
Использование функций для работы с данными различных форм
|
157
|
Результат
|
|
|
|
Enter
|
z for Cylinder,
|
с for Circle: z
|
|
Enter
|
radius:
|
2
|
|
|
Enter height:
|
5
|
|
|
Area of cylinder is: 87.9646
|
|
Следующий запуск:
|
|
|
Enter
|
z for Cylinder,
|
c for Circle: c
|
|
Enter
|
radius:
|
1
|
3.14159
|
|
Area of cylinder is:
|
|
Анализ
строках 5 и 6 объявлены прототипы перегруженных версий функции A rea (), первая принимает один параметр (радиус круга), а вторая — два параметра (радиус и высоту
цилиндра). У обеих функций одинаковые имена (A rea) и типы возвращаемого значения
\ d o u b le), но разные наборы параметров. Следовательно, функция перегружена. Опреде ления перегруженных функций находятся в строках 34-44, где реализованы две функции вычисления площади: круга по радиусу и цилиндра по радиусу и высоте соответственно. Интересно то, что, поскольку площадь цилиндра состоит из площади двух кругов (один сверху, второй снизу) и площади боковой стороны, перегруженная версия для цилиндра способна повторно использовать функцию A rea () для круга, как показано в строке 43.
Передача функции массива значений
Функция, которая отображает целое число, может быть представлена так:
void Displaylnteger(int Number);
У функции, способной отобразить массив целых чисел, прототип немного другой:
void Displaylntegers(int[] Numbers, int Length);
Первый параметр указывает, что передаваемые функции данные являются массивом,
второй параметр предоставляет его длину1, чтобы, используя массив, вы не пересекли его границы (листинг 7.8).
ИСТИН Г 7.8. Функция, получающая м ассив как параметр___________________________________
#include
using namespace std;
:
void DisplayArray(int Numbers[], int Length)
{
for (int Index = 0; Index < Length; ++Index)
cout « Numbers[Index] << " ";
He поступайте так никогда. Неправильно указав длину массива или изменив впоследствии его размер и забыв исправить абсолютно все вызовы функции, вы получите в лучшем случае ошибку выхода за границы массива, а в худшем — очень трудно обнаруживаемую ошибку перебора массива не до конца. Для определения размера массива лучше использовать оператор s i z e o f () в функ ции. — Примеч. ред.
158 ЗАНЯТИЕ 7. Организация кода при помощи функций
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cout « endl;
}
void DisplayArray(char Characters[], int Length)
{
for (int Index = 0; Index < Length; ++Index)
cout « Characters[Index] « it к ;
cout « endl;
}
int main()
{
int MyNumbers[4] = {24, 58, -1, 245} r
DisplayArray(MyNumbers, 4);
char MyStatement[7] = {'H ', 'e',
|
11' r
|
1
|
11
|
1 0
|
1
|
/
|
|
-L /
|
|
|
DisplayArray(MyStatement, 7);
return 0;
}
Результат
58 -1 245
H e l l o !
Анализ
Здесь есть две перегруженные версии функции D is p la y A rra y (): одна отображает со держимое элементов целочисленного массива, а вторая символьного. В строках 22 и 25 вызываются две функции, используя как параметр массива целых чисел и символов соот ветственно. Обратите внимание, что при объявлении и инициализации массива символов (строка 24) был преднамеренно включен нулевой символ. Это хорошая привычка, даже при том, что сейчас массив не используется как строка в операторе c o u t или подобном (c o u t « M y S ta te m e n t;), но впоследствии это может произойти.
Передача аргументов по ссылке
Давайте вернемся к функции вычисления площади круга по радиусу в листинге 7.1:
// Определения функции (реализация)
double Area(double InputRadius)
{
return Pi * InputRadius * InputRadius;
}
Здесь параметр I n p u tR a d iu s содержит значение, которое копируется в него при вы зове функции m ain ():
// Вызов функции "Area"
cout « "Area is: " << Area(Radius) « endl;
Использование функций для работы с данными различных форм
|
159
|
Это означает, что вызов функции A re a () никак не воздействует на переменную R a d iu s в функции m ain (), поскольку работает она с копией значения переменной R a d iu s, содержащейся в переменной In p u tR a d iu s . Иногда нужны функции, способные воздей ствовать на исходную переменную или изменять значение, которое доступно вне функции, скажем, в вызывающей функции. Вот когда вы объявляете параметр как получающий ар гумент по ссылке (by reference). Версия функции A rea (), вычисляющей и возвращающей площадь как передаваемый по ссылке параметр, выглядит следующим образом:
выходной параметр Result по ссылке void Area(double Radius, doubles Result)
{
Result = Pi * Radius * Radius;
Обратите внимание: функция A re a () в этой версии получает два параметра. Не про пустите амперсанд (&) рядом со вторым параметром R e s u lt . Этот знак указывает компи лятору, что второй аргумент не должен быть скопирован в функцию, что это ссылка на передаваемую переменную. Тип возвращаемого значения был изменен на v o id , поскольку функция теперь возвращает вычисленную площадь не как возвращаемое значение, а как выходной параметр по ссылке. Возвращение значений по ссылке демонстрирует код ли стинга 7.9, вычисляющий площадь круга.
ЛИСТИНГ 7.9. Возврат площади круга по ссылке, а не в качестве возвращаемого значения
#include
using namespace std;
const double Pi = 3.1416;
выходной параметр Result по ссылке void Area(double Radius, doubles Result)
{
Result = Pi * Radius * Radius;
}
13
:э
int main()
{
cout « "Enter radius: ";
double Radius = 0;
cin » Radius;
double AreaFetched = 0;
Area(Radius, AreaFetched);
ID cout « "The area is: " « AreaFetched « endl; return 0;
12 }
Результат
Enter radius: 2
The area is: 12.5664
160 ЗАНЯТИЕ 7. Организация кода при помощи функций
Анализ
Обратите внимание на строки 17 и 18, где функция A rea () вызывается с двумя пара метрами; второй параметр тот, который должен содержать результат. Поскольку функция A re a () получает второй параметр по ссылке, переменная R e s u lt, используемая в стро ке 8 в пределах функции A re a (), указывает на ту же область памяти, что и переменная d o u b le A re a F e tc h e d , объявленная в строке 17 вызывающей стороны (функции m ain ()).
Таким образом, вычисленный в функции A rea () результат (строка 8) доступен в функции m ain () и отображается на экране в строке 20.
Do'stlaringiz bilan baham: |