766______________________________Часть II. Программирование на C++

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

Область видимости

Отыскать единое определение области видимости может оказаться нелегким делом. Это слово всплывает в рассуждениях о самых различных сторонах языка C++. Согласно ARM (Annotated Reference Manual), существует четыре разновидности областей видимости: локальная, функции, файла и класса. Заглянув в предметный указатель ARM, вы насчитаете около 30 пунктов, имеющих отношение к области видимости.

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

Локальные объекты, размещенные в стеке. Локальными для функции являются объекты как базовых, так и любых производных типов, размещенные внутри функции. Это означает, что если определение переменной расположено между левой и правой скобками тела функции, то переменная размещается в памяти, отведенной под стек.

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

Для иллюстрации придумаем функцию, в теле которой объявлены две простые переменные:

void SomeFunction()

(

char *p = 0;

int num = 32;

// Некий код

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