Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Глава 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; Просмотров: 228; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.013 с.)
Главная | Случайная страница | Обратная связь