Читаем Освой самостоятельно С++ за 21 день. полностью

Следует отметить, что в C++ глобальные переменные почти никогда не используются. Язык C++ вырос из С, где использование глобальных переменных всегда было чревато возникновением ошибок, хотя обойтись без их применения также было не возможно. Глобальные переменные необходимы в тех случаях, когда программисту нужно сделать данные доступными для многих функций, а передавать данные из функции в функцию как параметры проблематично.

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

На занятии 14 вы познакомитесь с мощной альтернативой использованию глобальных переменных, которая предусмотрена в C++, но недоступна в языке С.

<p>Подробнее о локальных переменных</p>

О переменных, объявленных внутри функции, говорят, что они имеют локальную область видимости. Это означает, как упоминалось выше, что они видимы и пригодны для использования только в пределах той функции, в которой определены. Фактически в C++ можно определять переменные в любом месте внутри функции, а не только в ее начале. Областью видимости переменной является блок, в котором она определена. Таким образом, если в теле функции будет блок, выделенный парой фигурных скобок, и в этом блоке объявляется переменная, то она будет доступна только в пределах блока, а не во всей функции, как показано в листинге 5.4.

Листинг 5.4. Видимиость локальных переменных

1: // Листинг 5.4. Видимость переменных,

2: // обьявленных внутри блока

3:

4: #include

5:

6: void nyFunc;

7:

8: int main

9: {

10:    int x = 5;

11:    cout << "\nIn main x is: " << x;

12:

13:    myFunc;

14:

15:    cout << "\n8ack in main, x ts: " << x;

16:    return 0;

17: }

18:

19: void myFunc

20: {

21:

22:    int x = 6;

23:    cout << "\nIn myFunc. local x: " << x << endl;

24:

25:    {

26:       cout << "\nIn block in myFunc, x is: " << x;

27:

28:       int x = 9;

29:

30:       cout << "\nVery local x: " << x;

31:    }

32:

33:    cout << "\nOut of block, in myFunc, x: " << x << endl;

34: }

Результат:

In main x is: 5

In myFunc, local x: 8

In block in myFunc, x is

Very local x; 9

Out of block, in myFunc,

Back in main, x is: 5

Анализ: Эта программа начинается с инициализации локальной переменной x в функции main (строка 10). Выведенное в строке 11 значение переменной x позволяет убедиться, что переменная х действительно была инициализирована числом 5.

Затем в программе вызывается функция MyFunc, в теле которой в строке 22 объ­является локальная переменная с тем же именем x и инициализируется значением 8. Это значение выводится на экран в строке 23.

Блок, заключенный в фигурные скобки, начинается в строке 25, и в строке 26 сно­ва выводится значение локальной переменной x. Но в строке 28 создается новая пе­ременная с таким же именем x, которая является локальной по отношению к данному блоку. Эта переменная тут же инициализируется значением 9.

Значение последней созданной переменной x выводится на экран в строке 30. Ло­кальный блок завершается строкой 31, и переменная, созданная в строке 28, выходит за пределы видимости и удаляется из памяти.

В строке 33 на экран выводится значение той переменной x, которая была объяв­лена в строке 22. На нее никоим образом не повлияло определение новой переменной x в строке 28, и ее значение по-прежнему равно 8.

В строке 34 заканчивается область видимости функции MyFunc и ее локальная пе­ременная x становится недоступной. Управление программой возвращается к стро­ке 15, в которой выводится значение локальной переменной -x, созданной в строке 10. Вы сами можете убедиться в том, что на нее не повлияла ни одна из одноименных переменных, определенных в функции MyFunc.

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

<p>Операторы, используемые в функциях</p>

Фактически на количество или типы операторов, используемых в функциях, ника­ких ограничений не накладывается. И хотя внутри функции нельзя определить другую функцию, но из одной функции можно вызывать сколько угодно других функций; именно этим и занимается функция main почти в каждой программе C++. Более того, функции могут вызывать даже самих себя (эта ситуация рассматривается в раз­деле, посвященном рекурсии).

Хотя на размер функции в C++ также никакого ограничения не накладывается, лучше, чтобы тело функции не разрасталось до неограниченных масштабов. Многие специалисты советуют сохранять небольшой размер функций, занимающий одну страницу экрана, по­зволяя тем самым видеть всю функцию целиком. Конечно же, это эмпирическое правило, часто нарушаемое даже очень хорошими программистами, но следует помнить: чем мень­ше функция, тем она проще для понимания и дальнейшего обслуживания.

Перейти на страницу:

Похожие книги

Сущность технологии СОМ. Библиотека программиста
Сущность технологии СОМ. Библиотека программиста

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Дональд Бокс

Программирование, программы, базы данных / Программирование / Книги по IT