|
Программирование >> Унарные и бинарные операторы
Сделай функцию сам Функции, встречавшиеся нам в предыдущих главах, были двух разновидностей: самостоятельные , то есть не связанные с какими-либо объектами (такова функция 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. Указатели
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |