Читать «Полный справочник по С++» онлайн - страница 19

Герберт Шилдт

Глобальные переменные хранятся в специально отведенном для них месте. Они оказываются весьма полезными, если разные функции в программе используют одни и те же данные. Однако, если в них нет особой необходимости, глобальных переменных следует избегать. Дело в том, что они занимают память во время всего выполнения программы, даже когда уже не нужны. Кроме того, использование глобальных переменных там, где можно было бы обойтись локальными, ослабляет независимость функций, поскольку они вынуждены зависеть от сущности, определенной в другом месте. Итак, применение большого количества глобальных переменных повышает вероятность ошибок вследствие непредсказуемых побочных эффектов. Большинство проблем, возникающих при разработке больших программ, является следствием непредвиденного изменения значений переменных, которые используются в любом месте программы. Это может случиться, если в программе объявлено слишком много глобальных переменных.

Квалификаторы const и volatile

В языке С существуют два квалификатора, управляющих доступом и модификацией: const и volatile. Их следует указывать перед модификаторами типов и именами типов, которые они уточняют. Формально эти квалификаторы называют cv-квапификаторами (cv-qualifiers).

Квалификатор const

Переменные типа const не могут изменяться, однако их можно инициализировать. Компилятор может поместить эти переменные в постоянное запоминающее устройство (Random Access Memory — ROM). Рассмотрим пример.

| const int a=10;

Это объявление создает целочисленную переменную с именем а и начальным значением, равным числу 10, которое в остальной части программы изменить невозможно. Однако переменную а можно использовать в других выражениях. Переменная типа const может получить свое значение либо во время инициализации, либо с помощью других машинозависимых средств.

Квалификатор const можно использовать для защиты объектов, передаваемых в функцию в качестве аргументов. Иными словами, если в функцию передается указатель, она может модифицировать фактическое значение, на которое он ссылается. Но если указатель уточнить квалификатором const, функция не сможет изменить значение в соответствующей ячейке. Например, функция sp_to_dash (), рассмотренная ниже, выводит на печать тире, заменяя им пробелы в строке, которая является ее аргументом. Иначе говоря, “строка для проверки” будет напечатана как “строка—для—проверки”. Использование квалификатора const в объявлении параметра гарантирует, что код, помещенный внутри функции, не сможет модифицировать объекты, на которые ссылается указатель.