766______________________________Часть II. Программирование на C++
Для начала вы познакомитесь с понятием области видимости (scope) и с теми ограничениями, которые она налагает на возвращение значений. Вы узнаете, какими способами функции могут возвращать информацию и каким предположениям при этом должны удовлетворять ваши данные.
Область видимости
Отыскать единое определение области видимости может оказаться нелегким делом. Это слово всплывает в рассуждениях о самых различных сторонах языка C++. Согласно ARM (Annotated Reference Manual), существует четыре разновидности областей видимости: локальная, функции, файла и класса. Заглянув в предметный указатель ARM, вы насчитаете около 30 пунктов, имеющих отношение к области видимости.
Смысл этого термина зависит от контекста, в котором он употребляется. На данном этапе область видимости нас интересует только применительно к переменным, определенным внутри функций, то есть локальная. Конкретно мы займемся различиями между переменными, определенными внутри и вне функций.
Локальные объекты, размещенные в стеке. Локальными для функции являются объекты как базовых, так и любых производных типов, размещенные внутри функции. Это означает, что если определение переменной расположено между левой и правой скобками тела функции, то переменная размещается в памяти, отведенной под стек.
В результате при вызове функции переменной выделяется необходимое количество места, а при выходе из функции указатель стека возвращается в исходное положение, и при этом, естественно, переменная уничтожается. Это происходит вне зависимости от конкретного типа переменной; вы мало что можете здесь предпринять, но понимать суть происходящего необходимо.
Для иллюстрации придумаем функцию, в теле которой объявлены две простые переменные:
void SomeFunction()
(
char *p = 0;
int num = 32;
// Некий код
Участок памяти, в котором хранятся эти две переменные, резервируется в стеке соответствующей установкой так называемого указателя стека. При выходе из функции стек возвращается в свое первоначальное — то, которое было до вызова функции — состояние, освобождая пространство, занятое указателем р и целым num.