|
Программирование >> Дополнительные возможности наследования
ции компилятор узнает, как функция работает. Ни одну функцию нельзя вызвать в программе, если она не была предварительно объявлена. Объявление функции называется прототипом. Объявление функции Существует три способа объявления функции. Запишите прототип функции в файл, а затем используйте выражение с #include, чтобы включить его в свою программу. Запишите прототип функции в файл, в котором эта функция используется. Определите функцию перед тем, как ее вызовет любая другая функция. В этом случае определение функции одновременно и объявляет ее. Несмотря на то что функцию можно определить непосредственно перед использованием и таким образом избежать необходимости создания прототипа функции, такой стиль программирования не считается хорошим по трем причинам. Во-первых, требование располагать функции в файле в определенном порядке затрудняет поддержку программы в процессе изменения условий ее использования. Во-вторых, вполне возможна сит\аиия, когда функции А() необходимо вызвать функцию В(), но не исключено также, что при некоторых обстоятельствах и функции В() потребуется вызвать функцию А(). Однако невозможно определить функцию Д() до определения функции В() и в то же время функцию В() до определения функции А(), т.е. по крайней мере одна из этих функций обязательно должна быть предварительно объявлена. В-третьих, прототипы функций - это хорошее и сильное подспорье при отладке. Если согласно прототипу объявлено, что функция принимает определенный набор параметров или что она возвращает значение определенного типа, а затем в программе делается попытка использовать функцию, не соответствующую объявленному прототипу, то компилятор заметит эту ошибку еще на этапе компиляции профаммы, что позволит избежать неприятных сюрпризов в процессе ее выполнения. Прототипы многих встроенных функций уже записаны в файлы заголовков, добавляемые в программу с помощью itinclude. Для функций, создаваемых пользователями, профаммист должен сам позаботиться о включении в программу соответствующих прототипов. Тип параметра Имя параметра unsigned short int RndArea (int length, int width); тип возврата имя параметры точка с запятой Рис. 5.2. Составные части прототипа функции Прототип функции представляет собой выражение, оканчивающееся точкой с запятой, и состоит из типа возвращаемого значения функции и сигнатуры. Под сигнатурой функции подразумевается ее имя и список формальных параметров. Список формальньа параметров представляет собой список всех парамефов и их типов, разделенных запятыми. Составные части прототипа функции показаны на рис. 5.2. 49�604 в прототипе и в определении функции тип возвращаемого значения и сигнатура должны соответствовать. Если такого соответствия нет, компилятор покажет сообщение об ошибке. Однако прототип функции не обязан содержать имена параметров, он может ограничиться только указанием их типов. Например, прототип, приведенный ниже, абсолютно правомочен: long Area(int, int); Этот прототип объявляет функцию с именем Агеа(), которая возвращает значение типа long и принимает два целочисленных параметра. И хотя такая запись прототипа вполне допустима, это не самый лучший вариант. Добавление имен параметров делает ваш прототип более ясным. Та же самая функция, но уже с именованными параметрами, выглядит гораздо понятнее: long Area(int length, int width); Теперь сразу ясно, для чего предназначена функция и ее параметры. Обратите внимание на то, что для каждой функции всегда известен тип возвращаемого значения. Если он явно не объявлен, то по умолчанию принимается тип int. Однако ваши профаммы будут понятнее, если для каждой функции, включая main(), будет явно объявлен тип возвращаемого значения. В листинге 5.1 приводится программа, которая содержит прототип функции Агеа(). AucmuHz 6.1. ООъявпение, onpegeiieuue и использование функции 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 Листинг 5.1. Использование прототипов функций int Sinclude <iostream.h> int Area(int length, int width); прототип функции int mainO { Int lengthOfYard; int widthOfYard; int areaOfYard; cout << X nHow wide is your yard? ; cin WidthOfYard; cout << \ nHow long is your yard? ; cin lengthOfYard; areaOfYard= Area(lengthOfYard,widthOfYard); cout << X nYour yard is ; cout << areaOfYard; cout square feet\ n\ n ; return 0; int Area(int yardLength-, int yardWidth) return yardLength * yardWidth; , , ~ How wide is your yard? 100 How long is your yard? 200 Your yard is 20000 square feet P. i Прототип функции Area() объявляется в строке 4. Сравните прототип с определением функции, представленным в строке 25. Обратите внимание, что их имена, типы возвращаемых значений и типы параметров полностью совпадают. Если бы они были различны, то компилятор показал бы сообщение об ошибке. Единственное обязательное различие между ними состоит в том, что прототип функции оканчивается точкой с запятой и не имеет тела. Обратите также внимание на то, что имена параметров в прототипе - length и width - не совпадают с именами параметров в определении: yardLength и yardWidth. Как упоминалось выше, имена в прототипе не используются; они просто служат описательной информацией для программиста. Соответствие имен параметров прототипа именам параметров в определении функции считается хорошим стилем программирования; но это не обязательное требование. Аргументы передаются в функцию в порядке объявления и определения параметров, но без учета какого бы то ни было совпадения имен. Если в функцию Агеа() первым передать аргумент widthOfYard, а за ним - аргумент lengthOfYard, то эта функция использует значение widthOfYard для параметра yardLength, а значение lengthOfYard - для параметра yardWidth. Тело функции всегда заключается в фигурные скобки, даже если оно состоит только из одной строки, как в нашем примере. Опрвдвлвнив функции Определение функции состоит из заголовка функции и ее тела. Заголовок подобен прототипу функции за исключением того, что параметры в данном случае именованные и в конце заголовка отсутствует точка с запятой. параметры (Int length, int width) - открывающая фигурная скобка statements return (length * width); \ ключевое слово \ тип возврата J - закрывающая фигурная скобка Рис. 5.3. Заголовок и тело функции Тело функции представляет собой набор выражений, заключенных в фигурные скобки. Заголовок и тело функции показаны на рис. 5.3.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |