Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lek9-10.doc
Скачиваний:
5
Добавлен:
15.11.2018
Размер:
217.6 Кб
Скачать

Int main(){

int t = 13;

int & ref_t = t; // теперь ref_t синоним t

cout << "Nachal'noe znachenie t = " << t; // выводит 13

cout << "\nZnachenie ssilki ++ref_t = " << ++ref_t; // выводит 14

ref_t +=10;

cout << "\nref_t = " << ref_t; // 24

cout << "\nt = " << t; // 24

cout << "\n&t = " << &t;

cout << "\n&ref_t = " << &ref_t;

getchar();

getchar();

return 0;

}

/*

Nachal'noe znachenie t = 13

Znachenie ssilki ++ref_t = 14

ref_t = 24

t = 24

&t = 0012FED4

&ref_t = 0012FED4

*/

Классы памяти и динамическое выделение памяти

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

auto - автоматический - локальные идентификаторы, память для которых выделяется при входе в блок, т.е. составной оператор, и освобождается при выходе из блока. Слово auto является сокращением слова automatic.

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

extern - внешний - идентификаторы, называемые внешними, external, используются для связи между функциями, в том числе независимо скомпилированными функциями, которые могут находиться в различных файлах. Память, ассоциированная с этими идентификаторами, является постоянной, однако ее содержимое может меняться. Эти идентификаторы описываются вне функции.

register - регистровый - идентификаторы, подобные идентификаторам типа auto. Их значения, если это возможно, должны помещаться в регистрах машины для обеспечения быстрого доступа к данным.

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

Подведем итог.

Классы памяти, которые описываются внутри функции:

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

  2. регистровый, продолжительность существования - временно, область действия - локальная;

  3. статический, продолжительность существования - постоянно, область действия - локальная.

Классы памяти, которые определяются вне функции:

  1. внешний, продолжительность существования - постоянно, область действия глобальная (все файлы);

  2. внешний статический, продолжительность существования - постоянно, область действия - глобальная (один файл).

Динамическое выделение памяти

Самый простой метод – это объявление переменных внутри функций. Если переменная объявлена внутри функции, каждый раз, когда функция вызывается, под переменную автоматически отводится память. Когда функция завершается, память, занимаемая переменными, освобождается. Другой способ выделения памяти – статический. Если переменная определена вне функции, память для нее отводится статически, один раз в начале выполнения программы, и переменная уничтожается только тогда, когда выполнение программы завершается. Можно статически выделить память и под переменную, определенную внутри функции или блока. Третий способ выделения памяти в языке Си++ – динамический. Память для величины какого-либо типа можно выделить, выполнив операцию   new. В качестве операнда выступает название типа, а результатом является адрес выделенной памяти.

long* lp;

// создать новое целое число

lp = new long;

Complex* cp;

// создать новый объект типа Complex

cp = new Complex;

Созданный таким образом объект существует до тех пор, пока память не будет явно освобождена с помощью операции   delete. В качестве операнда delete должен быть задан адрес, возвращенный операцией new:

delete lp;

delete cp;

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

Если необходимо динамически создать массив, то нужно использовать немного другую форму new:

new int[100];

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

Освобождение памяти, выделенной под массив, должно быть выполнено с помощью следующей операции delete

delete [] address;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]