52________________________________________________Глава 1

мы и доступны для любых объектов внутри данного модуля, а также для объ-
ектов классов — наследников данного класса в других модулях. Объекты из
других модулей, классы которых не являются наследниками данного класса,
защищенных элементов не видят.
• • Элементы, объявленные внутри функции или блока (в рассмотренном примере
это переменная Ch4 объявленная внутри функции TForml::ButtonlClick), яв-
ляются локальными, т.е. они видимы и доступны только внутри данной функ-
ции или данного блока. При этом время жизни переменных, объявленных
внутри функции или блока, определяется временем активности данного бло-
ка. Так переменная Ch4 в нашем примере создается в момент вызова функции
TForml::ButtonlClick и уничтожается при завершении работы этой функции.
Сделать локальную переменную существующей постоянно можно с помощью
спецификации static.

• Переменные и функции, объявленные в головном файле проекта, являются
глобальными для этого файла. Если требуется доступ к ним из других моду-
лей, то для функций в них должны быть повторены их объявления, а для пе-
ременных — повторено объявление (без инициализации) со спецификацией
extern.

• Если во внутреннем блоке объявлена переменная с тем же именем, что во
внешнем блоке, или с тем же именем, что и глобальная переменная, то соот-
ветствующая внешняя или глобальная переменная в блоке не видна. В этом
случае подучить доступ к одноименной глобальной переменной можно только
с помощью унарной операции разрешения области действия «::».
Более подробные сведения об областях видимости переменных и функций вы
можете найти в главе 11 в разделе 11.6.

1.6.5.5 Передача параметров в функции

Параметры в функции могут передаваться в основном двумя способами: по
значению и по ссылке. То, что вы могли видеть в рассмотренном ранее примере —
это передача параметра по значению. В этом случае в заголовке функции указыва-
ется имя параметра и его тип. Например:

void Fifchar Ch);

В этом случае Ch — это локальное имя формального параметра, используемое то-
лько внутри данной функции. При вызове этой функции, который может иметь вид:

Fl(Ch2) ;

в памяти создается временная переменная с именем Ch, и в нее копируется значение
аргумента Ch2. На этом связь между Ch и Ch2 разрывается. Вы можете изменять
внутри функции значение Ch, но это никак не отразится на значении внешней пере-
менной Ch2, указанной в вызове функции в качестве аргумента.

Такая передача параметров по значению имеет свои достоинства и недостатки.
Достоинство заключается в том, что функция не может испортить переданный в нее
аргумент. Это важно для надежной работы приложения и позволяет разрабатывать
функции, не задумываясь о том, не использованы ли где-то в программе те же имена
параметров. Но у передачи параметра по значению имеется и ряд недостатков.
Во-первых, функция не может изменить значение аргумента, а иногда это очень же-
лательно. Во-вторых, копирование значения аргумента требует дополнительных за-
трат времени и памяти для хранения копии. Если речь идет о какой-то переменной
простого типа, это, конечно, не существенно. Но если, например, аргумент — это мас-
сив из тысячи элементов, то соображения затрат времени и памяти могут стать суще-
ственными. И в-третьих, после окончания работы функции временная переменная,
хранившая значение параметра, уничтожается. Поэтому ее нельзя использовать, на-
пример, для накопления какой-то информации.