Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцООППССРВ_89.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
673.79 Кб
Скачать

4. Объекты и их атрибуты

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

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

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

Леводопустимыми в операциях присваивания могут быть:

  • скалярные объекты;

  • индексированные переменные;

  • имена указателей;

  • разыменованные указатели;

  • уточненные имена;

  • косвенно уточненные имена;

  • ссылки на объекты;

  • выражения с операцией разыменования;

  • вызовы функций, возвращающие ссылки на объекты.

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

Функции типа объекта:

  • определяет объем памяти для объекта;

  • задает совокупность допустимых операций;

  • обеспечивает интерпретацию двоичного кода;

  • используется для контроля типов при присваивании.

Класс памяти (auto, register, static, dynamic, extern) определяется либо при определении либо по контексту (месту размещения определения в тексте программы).

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

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

Пример:

char cc[] = “ Внешний массив символов”;

void func(void)

{ char cc[] = “ Внутренний массив”;

cout<<’\n’<<cc; // Обращение к локальному массиву

cout<<’\n’<< ::cc; // Обращение к глобальному массиву

}

void main(void)

{ void func9void);

func();

}

Время жизни локального объекта определяется от момента вызова функции (начала блока) до момента выхода из функции (блока). Вне функции(блока) значение локального объекта не доступно. Можно сохранить значение локального объекта для повторного вызова функции, если объявить его с атрибутом static, например, static int a = 0; (переменная а инициализируется нулем только при первом вызове функции). При этом областью действия локального статического объекта является тело функции.

Время жизни глобального объекта определяется моментом инициации приложения и моментом его завершения.

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

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

Для остальных объектов, которые локализованы в файлах, используется внутреннее связывание.

Внешнее связывание задается явным использованием атрибута extern при описании объектов.