Время существования и область видимости переменных в С++

Управление областью видимости и временем существования переменных в языке программирования С++. Определение областей действия и видимости идентификатора. Обращение к скрытой локальной переменной. Сущность продолжительности хранения данных в памяти.

Рубрика Программирование, компьютеры и кибернетика
Вид статья
Язык русский
Дата добавления 21.01.2018
Размер файла 18,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

ВРЕМЯ СУЩЕСТВОВАНИЯ И ОБЛАСТЬ ВИДИМОСТИ ПЕРЕМЕННЫХ В С++

Дмитриев Владислав Леонидович

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

Каждая переменная, объявленная в программе, имеет две важнейшие характеристики: время существования и область видимости. Эти характеристики взаимосвязаны и влияют на использование переменной в программе. Объявление переменной вводит ее имя в область видимости. Это означает, что имя может использоваться только в определенном месте программы.

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

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

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

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

Локальную и глобальную переменные можно объявлять с одним и тем же именем. При этом объявление имени переменной в блоке скрывает объявление этого же имени во внешнем блоке или глобальное имя переменной. После выхода из блока имя внешней по отношению к этому блоку переменной восстанавливает свой смысл.

Таким образом, область видимости и область действия идентификатора несколько различаются, хотя чаще всего область видимости совпадает с областью действия.

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

#include

#include

using namespace std; // убрать эту строку в случае

// использования компилятора Borland C++ 5.02

int a=5;

int main()

{ int a=3; // скрывает глобальную переменную

cout<<"Local block_1: "<

Результат выполнения программы будет следующий:

Local block_1: 3

Global: 5

Local block_2: 7

Global: 5

Global after sum: 24

Local block_1: 3

Global: 24

Способа обращения к скрытой локальной переменной не существует. Как вариант в случае необходимости получения доступа к локальной переменной из вложенного блока можно рассматривать использование указателя:

int a=5;

int main()

{ int a=3, *p;

p=&a;

cout<<"Local block_1: "<

язык программирование идентификатор данные

Управлять областью видимости и временем существования переменных (или других объектов) можно либо изменением места объявления переменной в программе, либо используя модификаторы (классы памяти) auto, register, extern, static,mutable. Если класс памяти не указан явным образом, он определяется компилятором исходя из контекста объявления переменной. Более подробно о продолжительности хранения данных в памяти можно прочитать в [1].

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

Регистровая (register) переменная отличается от автоматической только памятью, выделяемой для ее хранения. Регистровая переменная хранится (по возможности) в регистрах процессора, и поэтому доступ к такой переменной осуществляется гораздо быстрее (переменная класса памяти auto хранится в оперативной памяти). Если свободные регистры памяти отсутствуют, то регистровая переменная становится автоматической.

Внешняя (extern) переменная является глобальной переменной, однако модификатор extern означает, что переменная будет объявлена (без слова extern) в другом месте программы или другом файле, где ей и будет выделена память. Поэтому такой класс памяти используется для создания переменных, доступных во всех модулях программы, в которых они объявлены. Пример:

#include

#include

using namespace std; // убрать эту строку в случае

// использования компилятора Borland C++ 5.02

extern int a; //объявление переменной a

int main()

{ cout<<"a: "<

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

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

#include

#include

using namespace std; // убрать эту строку в случае

// использования компилятора Borland C++ 5.02

int sum(int x)

{ static int s;

for (int j=1; j

В данном случае переменная s в функции sum описана как static, поэтому она не уничтожается после каждого вызова функции, и, тем самым, позволяет наращивать свое значение при каждом новом вызове функции. В результате выполнения программы на экране будет отображено следующее содержимое:

1= 1

1+2= 3

1+2+3= 6

1+2+3+4= 10

1+2+3+4+5= 15

1+2+3+4+5+6= 21

1+2+3+4+5+6+7= 28

1+2+3+4+5+6+7+8= 36

1+2+3+4+5+6+7+8+9= 45

1+2+3+4+5+6+7+8+9+10= 55

Сравните результат выполнения программы для случая, если вместо строки

static int s;

написать строку

int s; или int s=0;

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

#include "stdafx.h"

#include

#include

using namespace std;

struct client

{ mutable char name1 [20];

char name2 [20];

mutable double percent;

mutable int sum;

int year; };

const client CL = {"Petrova", "Svetlana", 0.08, 5000, 2013};

int main()

{ system("cls");

cout<

Здесь спецификатор const структуры CL предотвращает изменение ее элементов, однако спецификатор mutable, предшествующий ее элементам name1, percent и sum, снимает с данных элементов такое ограничение.

Замечание. Если при описании объекта (или переменной) инициализатор не задан, то глобальным объектам, объектам из пространства имен и локальным статическим объектам присваивается нулевое значение соответствующего типа.

Список литературы

1. Прата С. Язык программирования С++. Лекции и упражнения, 5-е изд.: Пер. с англ. М.: Вильямс, 2007. 1184 с.

Размещено на Allbest.ru

...

Подобные документы

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

    лабораторная работа [62,2 K], добавлен 06.07.2009

  • Общие сведения о функциях, их структура. Области видимости и классы памяти переменных в функциях. Классификация видов памяти, выделяемой под переменные и константы. Примеры объявления глобальных и локальных переменных. Обращение к функции и ее прототип.

    презентация [64,6 K], добавлен 09.12.2013

  • Конструкции Си, базовые типы данных языка программирования. Идентификаторы и типизированные константы. Область видимости и время жизни переменных. Функции преобразования символьных строк. Функции, работающие со строками. Разработка визуальных компонент.

    методичка [400,2 K], добавлен 06.07.2009

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

    презентация [83,4 K], добавлен 19.10.2014

  • Область видимости переменных. Хранение локальных данных в памяти компьютера. Использование опережающего описания для развязки закольцованных вызовов подпрограммы. Условия работоспособности рекурсивных подпрограмм. Параметры-функции и параметры-процедуры.

    презентация [36,8 K], добавлен 13.10.2013

  • Характеристика Javascript функции с параметрами (аргументами). Возврат значений, глобальные и локальные переменные в функции. Все способы создания пользовательских функций в Javascript. Область видимости переменных. Рекурсивная функция Javascript.

    лабораторная работа [75,8 K], добавлен 19.09.2019

  • Переопределение метода внутри одного класса. Сущность перегрузки унаследованного метода. Области применения абстрактного класса. Перегрузка унарных и бинарных операций. Области видимости локальных и глобальных переменных. Способы обращения к ним.

    презентация [81,2 K], добавлен 09.12.2013

  • Ознакомление с особенностями применения функций в языке Си++. Рассмотрение понятия прототипа, определение областей его применения. Изучение сущности автоматических, статистических и регистровых переменных, их использование при составлении программ.

    лабораторная работа [24,0 K], добавлен 15.07.2010

  • Модель памяти как набор опций компилятора, ее виды в BC++2.0, размеры и взаимное расположение. Назначение сегментных регистров в различных моделях памяти, порядок просмотра переменных. Основные и дополнительные функции динамических переменных в памяти.

    лабораторная работа [28,4 K], добавлен 06.07.2009

  • Алфавит языка программирования C#. Лексемы языка программирования. Область действия переменных. Понятие классов и объектов. Структура программного модуля на С#. Управление процессом повторения вычислений. Продолжение цикла и модификация параметра цикла.

    курсовая работа [557,1 K], добавлен 10.03.2014

  • Правили создания и алгоритм применения собственной функции пользователя в стандартном модуле редактора VBA. Изучение структуры кода функции. Перечень встроенных математических функций редактора Visual Basic. Определение области видимости переменной.

    практическая работа [440,0 K], добавлен 07.10.2010

  • Характеристика основных разделов программирования, изучаемых в курсе программирования на языке С++. Описание внутренних переменных, входных и выходных данных. Особенности использования компилятора Microsoft Visual Studio 2008. Руководство пользователя.

    курсовая работа [18,8 K], добавлен 14.12.2010

  • Анализ затрат и прибыли. Создание программного проекта для решения задачи о прибыли и убытках на языке программирования C#. Использование функций и переменных, компиляция программы. Алгоритмы и структуры данных. Тестирование программного обеспечения.

    курсовая работа [1,2 M], добавлен 03.01.2015

  • Разработка программ на языке Turbo Pascal на основе использования массивов данных. Особенности хранения данных, способы объявления переменных, действия над элементами массивов, их ввод и вывод. Практическое применение одномерных и многомерных массивов.

    методичка [17,8 K], добавлен 25.11.2010

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

    дипломная работа [4,3 M], добавлен 20.04.2012

  • Изучение способов организации консольного ввода/вывода данных в режиме черного экрана. Ознакомление со стандартными типами данных (целый, вещественный, символьный, логический) и методами описания переменных, использующихся на языке программирования С++.

    презентация [2,2 M], добавлен 17.04.2010

  • Структура программы в Турбо Паскале и определение переменной в ней. Понятие идентификатора и его основные ограничения. Операторы присваивания в языке программирования. Процедура ввода-вывода информации. Способы описания массива, обработка его элементов.

    контрольная работа [134,5 K], добавлен 28.09.2012

  • Постановка задачи для машинного моделирования, определение параметров и переменных. Алгоритмизация модели и её машинная реализация. Реализация алгоритма моделирования на общесистемном языке программирования. Описание диалога с пользователем, интерфейс.

    курсовая работа [703,1 K], добавлен 14.01.2013

  • Структура – это объединение одного либо более объектов (переменных, массивов, указателей, других структур). Понятие структурной переменной. Создание массивов структур. Использование вложенных структур в виде элементов массивов person, date, pibm.

    лабораторная работа [17,6 K], добавлен 15.07.2010

  • Сущность языка программирования, идентификатора, структуры данных. Хранение информации, алгоритмы их обработки и особенности запоминающих устройств. Классификация структур данных и алгоритмов. Операции над структурами данных и технология программирования.

    контрольная работа [19,6 K], добавлен 11.12.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.