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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

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

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


 

Комплексные типы данных

В C++ поддерживаются комплексные типы данных с помощью комплексного класса, который определяется в <complex>. В C существуют встроенные комплексные типы данных, а их поддержка осуществляется с помощью заголовочного файла <complex.h>. Эти подходы различны и несовместимы.

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

Пример 1

# include "complex.h"

complex c = 7.4; // инициализация 7.4+0i

complex d (8.5); // инициализация 8.5+0i

complex e (9.1,10.0);// инициализация 9.1+10.0i

complex f;


 

Указатель на void

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

Пример 1

int ar[5] = {4,5,6,7,8};

int *pi;

void *pv;

pv = ar; // допускается в С и С++

pi = pv; // допускается в С, но неверно в С++

pi = (int*)pv; // допускается в С и С++

 

В C++ можно присваивать адрес объекта произвольного типа указателю на объект базового класса. В C – нельзя.

Альтернативное правописание

В C++ or или | – ключевые слова. А в стандарте С99 они определены как макросы, следовательно требуется включение заголовочного файла <ISO646.h>.



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 63; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.30.162 (0.024 с.)