Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Глава 6. Создание функций 73
Такие аналогии между компьютерным и реальным миром не должны вас удивлять, так как компьютерный мир создан людьми. Типичное приложение может выглядеть следующим образом: int intVariablel, double
//функции различаются типу передаваемых аргументов //вызов //вызов //вызов
//вызов int)
// с константами функции работают аналогично // вызов // вызов 2) ; // вызов int) В каждом случае типы аргументов соответствуют тем, которые значатся в полном имени каждой функции. Тип возвращаемого значения в полное имя функции (называемое также ее сигнатурой) не входит. Следующие две функции имеют одинако- вые имена (сигнатуры) и поэтому не могут использоваться в одной программе: int n) ; //полным именем этой является double n) ; //имеет то же полное имя
Следующий код вполне int n); double d ,• //преобразуем тип полученного значения В этом фрагменте возвращаемые функцией значения типа in t преобразуются в double. Но следующий код некорректен: int n) ; double n); double d = //В этом случае мы преобразуем тип полученного //целочисленного значения или исполь зуем вторую функцию? В этом случае C++ не поймет, какое значение он должен использовать возвра- щаемое или ее целочисленным вариантом.
Как уже отмечалось, любой фрагмент кода программист может оформить как функцию, присвоив ей полное имя, таким образом объявляя ее для дальнейшего ис- пользования. Функции sumSequence () и square О, с которыми вы встречались этой главе, были определены до того, как вызывались. Но это не означает, что нужно всегда при- держиваться именно такого порядка. Функция может быть определена в любой части модуля (модуль — это другое название исходного файла C++).
74 Часть //. Становимся программистами Однако должен использоваться какой-то механизм, уведомляющий функцию () о функциях, которые могут вызываться ею. Рассмотрим следующий код: int argc, char* { 2) ; } in t in t
каких-то действий } При вызове функции () внутри полное ее имя неизвестно. Можно предположить, что именем функции является someFunc (int , int ) и воз- вращаемое ею значение имеет тип void. Однако, как видите, это вовсе не так. Согласен, компилятор C++ мог бы быть не таким ленивым и просмотреть весь модуль для определения сигнатуры функции. Но он этого не сделает, и с этим прихо" дится считаться13. Таков мир: любишь кататься — люби и саночки возить. Поэтому нам нужно проинформировать main() о полном имени вызываемой в ней функции до обращения к ней. Для этого используют прототипы функций. Прототип функции содержит ее полное имя с указанием типа возвращаемого зна- чения. Использование прототипов рассмотрим на следующем примере: int int); int argc, char* (
| int argl, int { каких-то действий } Использованный прототип объясняет миру (по крайней мере той его части, кото- рая следует после этого объявления), что полным именем функции someFunc () явля- ется (double, int) . Теперь при ее вызове в компилятор поймет, что 1 нужно преобразовать к типу double. Кроме того, функция main () осведомлена, что () возвращает целое значение. Вызов функции, возвращающей значение, является выражением. Следо- вательно, с ним можно работать так же, как и с любым другим значением этого же типа.
в В памяти переменные хранятся в трех разных местах. Переменные, объявленные внутри функции, называются локальными. В следующем примере переменная local - Variabl e является локальной по отношению к функции f n {): int void
Более того, как вы узнаете позже, тела функции в данном модуле может и не — Прим. ред. |
Последнее изменение этой страницы: 2019-04-19; Просмотров: 249; Нарушение авторского права страницы