Программирование >>  Аргументация конструирования 

1 ... 18 19 20 [ 21 ] 22 23 24 ... 108



Такие аналогии между компьютерным и реальным миром не должны вас удивлять, так как компьютерный мир создан людьми.

Типичное приложение может выглядеть следующим образом:

int intVariablel, intVariable2; double doubleVariable;

функции различаются no типу передаваемых аргументов someFunctionО; вызов someFunction(void)

someFunction(intVariablel); вызов someFunction(int) someFunction(doubleVariable); вызов someFunction(double) someFunction(intVariablel, intVariable2);

вызов int)

с константами функции работают аналогично

вызов

someFunction(1.О); вызов someFunction(double)

someFunction(1,2) ; вызов someFunction(int, int)

В каждом случае типы аргументов соответствуют тем, которые значатся в полном

имени каждой функции.

Тип возвращаемого значения в полное имя функции (называемое также

ее сигнатурой) не входит. Следующие две функции имеют одинаковые имена (сигнатуры) и поэтому не могут использоваться в одной программе:

int someFunction(int n) ;

полным именем это кции является someFunction (int) double someFunction(int n) ; имеет то же полное имя

Следующий код вполне

(МЛ I irit someFunction (int n ) ; \Н/ double d= someFunction (10) ,.

преобразуем тип полученного значения

В этом фрагменте возвращаемые функцией значения типа int преобразуются в double. Но следующий код некорректен:

int someFunction(int n) ; double someFunction(int n) ; double d = someFunction(10);

В этом случае мы преобразуем тип полученного целочисленного значения или исполь зуем вторую функцию?

В этом случае С++ не поймет, какое значение он должен использовать - возвращаемое или ее целочисленным вариантом.

Как уже отмечалось, любой фрагмент кода программист может оформить как

функцию, присвоив ей полное имя, таким образом объявляя ее для дальнейшего использования.

Функции sumSequence () и square О, с которыми вы встречались и этой главе, были определены до того, как вызывались. Но это не означает, что нужно всегда придерживаться именно такого порядка. Функция может быть определена в любой части модуля (модуль - это другое название исходного файла C++).



Однако доджен исподьзоваться какой-то механизм, уведомляющий функцию main О о функциях, которые могут вызываться ею. Рассмотрим следующий код:

indnt argc, char* pArgs [ ] )

someFuncd, 2) ;

int someFunc(double argl, int arg2) (

...выполнение каких-то действий

При вызове функции () внутри полное ее имя неизвестно.

Можно предположить, что именем функции является someFunc (int, int) и возвращаемое ею значение имеет тип void. Однако, как видите, это вовсе не так.

Согласен, компилятор C++ мог бы быть не таким ленивым и просмотреть весь модуль для определения сигнатуры функции. Но он этого не сделает, и с этим прихо дится считаться13. Таков мир: любишь кататься - люби и саночки возить.

Поэтому нам нужно проинформировать main() о полном имени вызываемой

в ней функции до обращения к ней. Для этого используют прототипы функций.

Прототип функции содержит ее полное имя с указанием типа возвращаемого значения. Использование прототипов рассмотрим на следующем примере:

int someFunc(double, int) ;

int main(int argc, char* pArgs[])

someFunc(1, 2);

int someFunc(double argl, int arg2)

...выполнение каких-то действий

Использованный прототип объясняет миру (по крайней мере той его части, которая следует после этого объявления), что полным именем функции someFunc () является someFunc (double, int). Теперь при ее вызове в main о компилятор поймет, что 1 нужно преобразовать к типу double. Кроме того, функция main () осведомлена, что someFunc () возвращает целое значение.

Вызов функции, возвращающей значение, является выражением. Следовательно, с ним можно работать так же, как и с любым другим значением этого же типа.

В памяти переменные хранятся в трех разных местах. Переменные, объявленные внутри функции, называются локальными. В следующем примере переменная local-Variable является локальной по отношению к функции f n {):

int globalVariable;

void fn()


Более того, как вы узнаете позже, тела функции в данном модуле может и не оказаться. - Прим. ред.



int localVariable;

static int staticVariable;

До вызова fn () переменной localVariable не существует. После окончания работы функции она оставляет этот бренный мир и ее содержимое навсегда теряется. Добавлю, что доступ к ней имеет только функция f п (), остальные использовать ее не могут.

А вот переменная ariable существует на протяжении работы всей программы и в любой момент доступна всем функциям.

Статическая переменная staticVariable является чем-то средним между локальной и глобальной переменными. Она создается, когда программа при выполнении достигает описания переменной (грубо говоря, когда происходит первый вызов функции). К тому же StaticVariable доступна только из функции fn(). Но, в отличие

от localVariable, переменная staticVariable продолжает существовать и после

окончания работы функции. Если в функции fn() переменной staticVariable присваивается какое-то значение, то оно сохранится до следующего вызова fn ().



1 ... 18 19 20 [ 21 ] 22 23 24 ... 108

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика