246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 19
Текст из файла (страница 19)
В качестве возврата можно задавать какконстантныезначения,такицелыевыражения,например:return5;return(x>5);return(MyFunction());Всеприведенныевышевыраженияявляютсяправомочнымиустановкамивозвратафункций,если исходить из того, что функция MyFunction() сама возвращает некоторое значение. Второевыражение,return(x>5),будетвозвращатьfalse,еслиxнебольше5,илиtrue,еслиxбольше5.Таким образом, если в возврате задается логическое выражение, то возвращаются не значенияпеременнойx,алогическиезначенияfalseилиtrue(ложьилиистина).После того как в функции встретится ключевое слово return, будет выполнено выражение,стоящее за этим ключевым словом, и его результат будет возвращен в основную программу поместувызовафункции.Послевыполненияоператораreturnпрограмманемедленнопереходиткстроке,следующейпослевызовафункции,илюбыевыражения,стоящиевтелефункциипослеключевогословаreturn,невыполняются.Однакофункцияможетсодержатьнесколькооператоровreturn.Этаидеяиллюстрируетсявлистинге5.6.Листинг5.6.Использованиенесколькихоператоровreturn1://Листинг5.6.Использованиенескольких2://операторовreturnвтелеФункции3:4:#include<iostream.h>5:6:intDoubler(intAmountToDouble);7:6:intmain()9:{10:11:intresult=0:12:intinput;13:14:cout<<"Enterаnumberbetween0and10,000todouble:":15:cin>>input;16:17:cout<<"\nBeforedoubleriscalled...";18:cout<<"\ninput:"<<input<<Mdoubled:"<<result<<"\n";19:20:result=Doubler(input);21:22:cout<<"\nBackfromDoubler...\n";23:cout<<"\ninput:"<<input<<"doubled:"<<result<<"\n";24:25:26:return0;27:}28:29:int0oubler(intoriginal)30:{31:if(original<=10000)32:returnoriginal*2;33:else34:return-1;35:cout<<"Voucan'tgethere!\n";36:}Результат:Enteranumberbetween0and10,000todouble:9000Beforedoubleriscalled...input:9000doubled:0Backfromdoubler...input:9000doubled:18000Enteranumberbetween0and10.000todouble:11000Beforedoubleriscalled...input:11000doubled:0Backfromdoubler...input:11000doubled:-1Анализ: В строках 14 и 15 программа предлагает пользователю ввести число и coхраняетего в переменной input.
В строке 18 отображается только что введенное число вместе созначениемлокальнойпеременнойresult.Встроке20вызываетсяфункцияDoubler()ивведенноезначениепередаетсяейкакпараметр.Результатвыполненияфункцииприсваиваетсялокальнойпеременнойresult,ивстроке23сновавыводятсязначениятехжепеременных.В строке 31, относящейся к функции Doubler(), значение переданного параметрасравниваетсясчислом10000.Еслиокажется,чтоононепревышает10000,функциявозвращаетудвоенное значение исходного числа.
Если оно больше 10 000, функция возвращает число -1 вкачествесообщенияобошибке.Выражение в строке 35 никогда не будет достигнуто, потому что при любом значениипереданногопараметра(большем10000илинет)возвратизфункциибудетосуществленлибовстроке32,либовстроке34,новлюбомслучаедостроки35.Хорошийкомпиляторсгенерируетпредупреждение,чтоэтовыражениенеможетбытьвыполнено,ихорошийпрограммистдолженпринятьсоответствующиемеры!ВопросыиответыВ чем состоит разница между объявлениями int main() и void main() и какое из них лучшеиспользовать? Ведь оба варианта работают одинаково хорошо, поэтому стоит ли применятьпервыйвариантintmain(){return0;}?Обаобъявлениябудутработатьсбольшинствомкомпиляторов,нотольковариантintmain()является ANSI-совместимым, следовательно, только объявление int main() гарантирует работупрограммы.По существу, отличие состоит в следующем.
При использовании объявления int функцияmain()возвращает значение для операционной системы. После завершения работы вашейпрограммыэтозначениемогутперехватить,например,программыпакетнойобработки.И хотя вы вряд ли будете использовать возвращаемое значение, стандарт ANSI требует егоприсутствия.Значенияпараметров,используемыепоумолчаниюДля каждого параметра, объявляемого в прототипе и определении функции, должно бытьпередано соответствующее значение в вызове функции.
Передаваемое значение должно иметьобъявленныйтип.Следовательно,еслинекотораяфункцияобъявленакакlongmyFunction(int);то она действительно должна принимать целочисленное значение. Если тип объявленногопараметранесовпадетстипомпередаваемогоаргумента,компиляторсообщитобошибке.Из этого правила существует одно исключение, которое вступает в силу, если в прототипефункциидляпараметраобъявляетсястандартноезначение.Этозначение,котороеиспользуетсявтомслучае,еслипривызовефункциидляэтогопараметранеустановленоникакогозначения.Несколькоизменимпредыдущееобъявление:longmyFunction(intx=50);Этот прототип нужно понимать следующим образом.
Функция myFunction возвращаетзначениетипаlongипринимаетпараметртипаint.Ноеслипривызовеэтойфункцииаргументпредоставлен не будет, используйте вместо него число 50. А поскольку в прототипах функцийимена параметров не обязательны, то последний вариант объявления можно переписать подругому:longmyFunction(int=50);Определениефункциинеизменяетсяприобъявлениизначенияпараметра,задаваемогопоумолчанию.Поэтомузаголовокопределенияэтойфункциибудетвыглядетьпо-прежнему:longmyFunction(intx)Если при вызове этой функции аргумент не устанавливается, то компилятор присвоитпеременнойxзначение50.Имяпараметра,длякотороговпрототипеустанавливаетсязначениепо умолчанию, может не совпадать с именем параметра, указываемого в заголовке функции:значение,заданноепоумолчанию,присваиваетсяпопозиции,анепоимени.Установкузначенийпоумолчаниюможноназначитьлюбымиливсемпараметрамфункции.Ноодноограничениевсежедействует:есликакой-топараметрнеимеетстандартногозначения,то ни один из предыдущих по отношению к нему параметров также не может иметьстандартногозначения.Предположим,прототипфункцииимеетвидlongmyFunction(intParam1,intParam2,intParam3);тогдапараметруParam2можноназначитьстандартноезначениетольковтомслучае,еслиназначено стандартное значение и параметру Param3.
Параметру Param1 можно назначитьстандартноезначениетольковтомслучае,еслиназначеныстандартныезначениякакпараметруParam2,такипараметруParam3.Использованиезначений,задаваемыхпараметрамфункцийпоумолчанию,показановлистинге5.7.Листинг 5.7. Использование значений, заданных по умолчанию для параметровфункций1://Листинг5.7.Использованиестандартных2://значенийпараметров3:4:#include<iostream.h>5:6:intVolumeCube(intlength,intwidth=25,intheight=1);7:8:intmain()9:{10:intlength=100;11:intwidth=50;12:intheight=2;13:intvolume;14:15:volume=VolumeCube(length,width,height);16:cout<<"Firstvolumeequals:"<<volume<<"\n";17:18:volume=VolumeCube(length,width);19:cout<<"Secondtimevolumeequals:"<<volume<<"\n";20:21:volume=VolumeCube(length);22:cout<<"Thirdtimevolumeequals:"<<volume<<"\n";23:return0;24:}25:26:VolumeCube(intlength,intwidth,intheight)27:{28:29:return(length*width*height);30:}Результат:Firstvolumeequals:10000Secondtimevolumeequals:5000Thirdtimevolumeequals:2500Анализ: В прототипе функции VolumeCube() B строке 6 объявляется, что функцияпринимает три параметра, причем последние два имеют значения, устанавливаемые поумолчанию.Эта функция вычисляет объем параллелепипеда на основании переданных размеров.
Еслизначение ширины не передано, то ширина устанавливается равной 25, а высота — 1. Еслизначение ширины передано, а значение высоты нет, то по умолчанию устанавливается толькозначение высоты. Но нельзя передать в функцию значение высоты без передачи значенияширины.Встроках10—12инициализируютсяпеременные,предназначенныедляхраненияразмеровпараллелепипедаподлине,ширинеивысоте.ЭтизначенияпередаютсяфункцииVolumeCube()встроке15.Послевычисленияобъемапараллелепипедарезультатвыводитсявстроке16.Встроке18функцияVolumeCube()вызываетсяснова,нобезпередачизначениядлявысоты.Вэтомслучаедлявычисленияобъемапараллелепипедаиспользуетсязначениевысоты,заданноепоумолчанию,иполученныйрезультатвыводитсявстроке19.ПритретьемвызовефункцииVolumeCube()(строка21)непередаетсянизначениеширины,ни значение высоты.
Поэтому вместо них используются значения, заданные по умолчанию, иполученныйрезультатвыводитсявстроке22.Рекомендуется:Помните, что параметры функции действуют внутри нее, подобнолокальнымпеременным.Не рекомендуется:Не устанавливайте значение по умолчанию для первого параметра,если для второго параметра используемого по умолчанию значения не предусмотрено. Незабывайте, что аргументы, переданные в функцию как значения, не могут повлиять напеременные, используемые при вызове функции. Не забывайте, что изменения, внесенные вглобальную переменную в одной функции, изменяют значение этой переменной для всехфункций.ПерегрузкафункцийВ языке C++ предусмотрена возможность создания нескольких функций с одинаковымименем.
Это называется перегрузкой функций. Перегруженные функции должны отличатьсядруг от друга списками параметров: либо типом одного или нескольких параметров, либоразличным количеством параметров, либо и тем и другим одновременно. Рассмотримследующийпример:intmyFunction(int,int);intmyFunction(long,long);intmyFunction(long);ФункцияmyFunction()перегруженастремяразнымиспискамипараметров.Перваяивтораяверсииотличаютсятипамипараметров,атретья—ихколичеством.Типы возвращаемых значений перегруженных функций могут быть одинаковыми илиразными.