Области видимости и время жизни переменных

В языках С и С++ определены правила обзора, которые устанавливают такие понятия, как видимость и время жизни (существования) объектов. В самом общем смысле достаточно различать две области видимости - глобальную и локальную.

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

Локальная область видимости определяется границами блока, т.е. начинается с открывающей фигурной скобки ({) и оканчивается закрывающей фигурной скобкой (}). Имя, объявленное в локальной области, известно только внутри этой области. Поскольку блоки могут быть вложенными, локальные области также могут быть вложенными. Самой распространенной локальной областью является область, определенная функцией. Локальные переменные создаются при входе в их блок, а разрушаются при выходе из блока. Это означает, что их значения не хранятся между вызовами функций. Чтобы сохранить значения переменных между вызовами, можно использовать модификатор static.

В языке С++ и версии С99 локальные переменные можно объявлять практически в любом месте блока, а в версии С89 они должны быть объявлены в начале блока до выполнения каких-либо инструкций "действия".

Пример 1

Void f(int a)

{

int a;

 a = 10;

int b; // ОК для С++ и С99, но не для С89

 ....

}

Глобальная переменная должна быть объявлена вне всех функций, включая main(). Глобальные переменные, как правило, размещаются в начале файла перед функцией main(), т.к. переменная должна быть объявлена до ее использования; кроме того, размещение глобальных переменных в определенном месте облегчает чтение программы.

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


Оператор разрешения области видимости (::). Пространство имён

Оператор разрешения области видимости (::)

Оператор разрешения области видимости (::) задает область видимости, которой принадлежит член и имеет следующую форму записи:

Имя::имя_члена

Здесь имя задает имя класса или пространства имен, в котором содержится член, заданный элементом имя_члена. Другими словами, имя определяет область видимости, внутри которой может находиться идентификатор, заданный элементом имя_члена.

При ссылке на глобальную область видимости элемент имя задавать не нужно. Например, для обращения к глобальной переменной a, которая "скрыта" за локальной переменной с таким же именем a, нужно использовать оператор:: следующим образом:::a

Пространства имен

В языке С++ можно создать локальную область видимости, используя ключевое слово namespace. Пространство имен определяет некоторую декларативную область. Ее назначение - ограничить действие имен. Общая форма задания пространства имен такова:

namespace <имя_пространства_имен> {

//.....

}

Пример 1

создается пространство имен MyNameSpace, а внутри него объявляется переменная count

namespace MyNameSpace {

int count;

}

На имена, объявленные в пространстве имен, могут напрямую ссылаться другие инструкции внутри того же пространства имен. Вне своего пространства имен к именам можно получить доступ двумя путями. Во-первых, использовав оператор разрешения области видимости (::)

Пример 2

MyNameSpace::count = 10;

Во-вторых, можно использовать инструкцию using, которая привносит заданное имя или пространство имен в текущую область видимости.

Пример 3

using namespace MyNameSpace;

count = 100;

// В данном случае к переменной можно обращаться напрямую, т.к. теперь она относится к текущей области видимости.

При появлении языка С++ элементы, объявленные в библиотеке С++, относились к глобальному (т.е. безымянному) пространству имен. Однако ныне действующий стандарт С++ все эти элементы относит к пространству имен std.


 


Булевы типы данных

В C++ булев тип данных именуется bool, а слова true и false являются ключевыми.

В C булев тип данных именуется _Bool, но при включении заголовочного файла <stdbool.h> можно пользоваться ключевыми словами bool, true, false.

Объект типа bool может принимать одно из двух значений: true и false.

Например:

Пример 1

// инициализация строки

string search_word = get_word();

// инициализация переменной found

bool found = false;

string next_word;

while (cin >> next_word)

if (next_word == search_word) found = true;

 //...

// сокращенная запись: if (found == true)

If (found)

cout << "ok, мы нашли слово\n";

else cout << "нет, наше слово не встретилось.\n";

 

Хотя bool относится к одному из целых типов, он не может быть объявлен как signed, unsigned, short или long, поэтому приведенное определение ошибочно:

Пример 2

// ошибка

short bool found = false;

 

Объекты типа bool неявно преобразуются в тип int. Значение true превращается в 1, а false – в 0. Например:

Пример 3

bool found = false;

int occurrence_count = 0;

while (/* mumble */)

{ found = look_for(/* something */);

// значение found преобразуется в 0 или 1

occurrence_count += found; }

Таким же образом значения целых типов и указателей могут быть преобразованы в значения типа bool. При этом 0 интерпретируется как false, а все остальное как true:

Пример 4

// возвращает количество вхождений

extern int find(const string&);

bool found = false;

if (found = find("rosebud"))

// правильно: found == true

// возвращает указатель на элемент

extern int* find(int value);

if (found = find(1024))

// правильно: found == true


 


Модификатор const

В C++ глобальные константы связаны внешним образом, а в C – внутренним

Пример 1

const double PI = 3.1415926 <=> static const double PI = 3.1415926

(Если оба объявления не включены в состав функции.)

Правило, существующее в C++, нацелено на упрощение использования констант в заголовочных файлах. Если константа связана внутренним образом, тогда каждый файл, включающий заголовочный файл, получает свою копию константы. Если константа связана внешним образом, тогда в одном из файлов должно существовать определенное объявление, в то время как остальные файлы должны содержать ссылочные объявления на файл, содержащий ключевое слово external. В некоторых случаях в C++ можно использовать слово extern, чтобы создавать значения const, имеющие внешнее связывание. Тогда в обоих языках могут быть созданы константы, связанные внешним и внутренним образом.

Различие между C и C++ заключается только в том, какого типа константы используются по умолчанию.

Пример 2

const int APS = 100;

double loon[APS]; //допустима в С++, но недопустима в С.


 


Константы char

Язык C считает константы char константами целочисленными, а C++ относит их к типу char

Пример 1

char ch = ‘B’;

В C const B будет отведен код памяти int, такое же численное значение хранится в переменной ch, но здесь оно занимает один байт памяти. В C++ используется один байт памяти как для В, так и для ch (sizeof(char)<=sizeof(int)).

Пример 2

char ch = ‘B’;

sizeof('B') = 1;

sizeof(ch) = 1;


 



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: