Программирование >>  Унарные и бинарные операторы 

1 ... 6 7 8 [ 9 ] 10 11 12 ... 37


Сделай функцию сам

Функции, встречавшиеся нам в предыдущих главах, были двух разновидностей: самостоятельные , то есть не связанные с какими-либо объектами (такова функция sort()), и связанные с объектами точкой (собственные функции объектов), такие, например, как infi le.qenO.

Независимо от того, свободна функция или подчинена объекту, она чаще всего принимает что-то извне (функция infile.openo принимает имя файла) и довольно часто что-то возвращает тому, кто ее вызвал.

Функции очень широко используются в С++, потому что позволяют разбить сложную задачу на несколько более простых. Один раз написанная функция может применяться многократно. Собственно, таковы стандартные функции sortC), randori shuff 1 е(), accumul ate(), уже встречавшиеся нам.

Но как бы нн был велик набор стандартных функций, всегда возникает потребность в своей функции, решающей часть конкретной задачи. Профамма, показанная в листинге 5.1, использует функцию mi пЗО, возвращающую минимальное из трех целых чисел.

Листинг 5.1

include <iostream> using namespace std: int minSCint x. int y. int z){

int min=X;

if(y < min) min=y:

if(z < min) min=z:

return mln;

int main(){

cout min3(2.5.-5) endl; }

Сделай функцию сам 81

В этой профамме после сфоки using namespace std идет описание функции min3(), состоящее из заголовка int niin3(int x.int y.int z) и тела функции, заключенного в фигурные скобки. В круглых скобках помещен список параметров функции, то есть список объектов, с которыми функция имеет дело. В нашем случае это три неременных типа int. Перед списком параметров тоже стоит идентификатор типа int, а это значит, что функция mi пЗ() имеет тип i nt и ее можно использовать в арифметических выражениях, как простое число. Посмотрите еще раз на единственн)то строку главной программы:

cout min3(2.5.-5) endl;

В этой строке некое число min3(2.5,-5) выводится на экран. Разделенные запятой цифры (2,5, -5) - это три числа, поступающие на вход функции, чтобы она определила самое маленькое из них. Эти числа называются аргументами функции. Число и типы аргументов должны соответствовать числу и типам параметров, перечисленных в заголовке функции. В нашем случае это три переменные типа int.

Теперь самое время взглянуть на внутреннее усфой-ство функции, в которой обрабатываются поступившие на вход аргументы:

int minSCint х. int у. int z){ int min-x; if (у < min) min=y: if(z < min) min-z; return min:

Когда вызывается функция min3(2,5.-5), аргументы занимают место параметров. Иными словами, параметр X становится равным 2, параметр у - 5, парамеф Z - -5. Далее внутри функции создается переменная min, и ей присваивается значение первого параметра, то есть 2. Затем min сравнивается со вторым аргументом. Если у < min, переменная min ставится равной у. В нашем



Функции-тезки

Функция min3(), созданная нами в прсды;1ун1ем разделе, работает только с целыми числами. Конечно, ее аргументы могут быть и Т1ша doubl е, например min3(2.5.-5.5);B этом случае компиля гор выдаст предупреждепие п попытается привести инородную переменнуюктипу int. Нотог-да потеряется дробная час гь, и в результате минимальное значение, определенное функцией, будет -5, а не -5.5.

Значит, для переменных типа double нужна функция с другими параметрами и другим типом возврап1аемо-го результата. Программа, показанная в листинге 5.2, содержит описания двух функций. Первая определяет минимальное из трех целых чисел, вторая делает то же самое, но уже с числами типа double. Листинг 5.2

#include <iostream>

using namespace std:

int min3(int x. int y. int z){

int mip-x;

if(y < min) min=y;

if(z < min) min=z:

return min:

double min3(double x. double y. double z)( double min=x: if(y < min) min=y; if(z < min) min-z; return min;

int main(){

int a=2.b=5.c=-5;

cout min3(a*c,b.c) endl;

cout min3(0.03*3.10.0.5.0) endl;

Компилятор С++ ничуть не смущает, что две функции, работающие со значениями разной природы, называются одинаково. Когда вызывается minSC) с целочисленными аромег£тами (обратите внимание, это могут быть не только числа, но переменные и выражения соответствующего типа), компилятор решает, что нужно использовать первую функцию, возвращающую целое. Если же используются аргументы типа double, вызывается вторая функция с тем же назва1П1ем, по, по сути,

При втором вызове функции используется смешанный аргумент - 0.03*а,янляюнш1 1ся произвеленисм константы типа double на цслочпслсппую переменную. Но поскольку целое число всмс-HiaHHOM выражении нодтягиваегся*- к Tiniy double, сам аргумент тоже будет иметь тип double.

случае у=5, поэтому условие не выполняется, переменная min остается прежней, и программа переходит к следующей строке, где сравниваются z и min. В нашем случае z=-5, поэтому условие г < min выполняется, и неременная min становится равной -5. И наконец, инструкция return min возвращает значение min во внешний мир, после чего на экране появляется -5.

Познакомивип1сь с тем, как функции обрабатывают аргументы и вгавраищют значения, уместно вспо.мнить о функции mainO, которая обт,является как int main(){}, то есть oira возврап1ает значение типа int, но куда? Так как mai п() - самая главная функ1и1Я в программе, возвращать значегте она может только тому, icro главнее, то есть операционной системе. Поэтому инструкции return внутри main() обычно содержат коды завершения, например:

return 0;

Эта инструкция означает, что все в порядке. Другие целые числа могут говорить операционной системе об аварийном завершении программы и его причинах.

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



Параллельные миры

в предыдущих разделах мы знакомились с функцией, принимающей три аргумента и возвращающей минимальное из полученных трех значений.

Но бывают функции, которым нечего возвращать, созданные, например, для обмена значениями двух однотипных переменных. Пусть, например, переменная а равна двум, а переменная b - пяти. Вызываем функцию exchngc а. Ь) - и вот уже в переменной а - пятерка, а в переменной b - двойка.

Программа, показанная в листинге 5.3, по идее, должна решать эту задачу.

Листинг 5.3

#include <iostream> using namespace std: void exchngCint a. int b){

int tmp:

tmp=a:

a-b:

b=tmp:

int mainC){ int a=2.b=5; exchngCa.b):

cout a= a end!: cout b= b endl: return 0: }

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

В этом случае поможет особый тип объекта С++, называемый указателем. Указатель - это не сам объект, а его адрес. Чтобы превратить указатель в объект, применяется оператор *. Если, скажем, р - это указатель на переменную типа int, то *р - сама переменная типа int. Так, со звездочкой указатели и объявляются в программе, чтобы показать, что *р - некое значение типа int:

int *р: р - указатель на int

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

Заметим, что функции с одним и тем же именем могут иметь в С++ разное число аргументов. Если тип и число аргументов соответствуют описанию функции, компилятор без колебаний выберет нужную.

Ho программа упрямо выводит на экран в=2, b=5, потому что функция exchngCint а, int Ь) не может повлиять на переменные а и b основной программы.

Все дело в том, что параметры а и b функци и exchngс i nt а. int b) не имеют никакого отношения к переменным а и b основной программы. То, что они так же называются - простое совпадение. Переменные основной программы и параметры функции соприкасаются лишь в момент ее вызова. Тогда параметр а становится равным двум, а параметр b - пяти. Далее функция обменивает значения параметров, так что b внутри функции становится равным двум, а параметр а - пяти. Но лишь на мгновение. Когда происходит возврат в основную программу, переменные, жившие внутри функции, пропадают, их больше нет. А переменные основной программы а и b остаются теми же. Можно сказать, что переменные, попавшие в функцию, оказываются в параллельном мире, из которого можно вернуться в наш мир только с помощью инструкций return.

Указатели



1 ... 6 7 8 [ 9 ] 10 11 12 ... 37

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