|
Программирование >> Аргументация конструирования
Такие аналогии между компьютерным и реальным миром не должны вас удивлять, так как компьютерный мир создан людьми. Типичное приложение может выглядеть следующим образом: 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 ().
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |