Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c++ 2.0.docx
Скачиваний:
4
Добавлен:
25.09.2019
Размер:
77.41 Кб
Скачать

15)Типы данных, определяемые пользователем: объединения.

Объединение (union) представляет собой частный случай структуры, все поля которой располагаются по одному и тому же адресу. Формат описания такой же, как у структуры, только вместо ключевого слова struct используется слово union. Длина объединения равна наибольшей из длин его полей. В каждый момент времени в переменной типа объединение хранится только одно значение, и ответственность за его правильное использование лежит на программисте. Объединения применяют для экономии памяти, а также для разной интерпретации одного и того же битового представления:

struct Options {

bool centerX:1;

bool centerY:1;

unsigned int shadow:2;

unsigned int palette:4;

};

union {

unsigned char ch;

Options bit;

}option={0xC4};

cout << option.bit.palette;

option.ch &= 0xF0;// наложение маски

По сравнению со структурами на объединения налагаются некоторые ограничения: объединение может инициализироваться только значением его первого элемента; объединение не может содержать битовые поля; объединение не может содержать виртуальные методы, конструкторы, деструкторы и операцию присваивания; объединение не может входить в иерархию классов.

16) Конструктор и деструктор, их свойства (Паскаль).

Конструкторы и деструкторы являются специализированными формами методов. Используемые в связи с расширенным синтаксисом стандартных процедур New и Dispose, конструкторы и деструкторы обладают способностью размещения и удаления динамических объектов. Кроме того, конструкторы имеют возможность выполнить требуемую инициализацию объектов, содержащих виртуальные методы. Как и все другие методы, конструкторы и деструкторы могут наследоваться, а объекты могут содержать любое число конструкторов и деструкторов

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

Приведем несколько примеров конструкторов:

constructor Field.Copy(var F: Field);

begin

Self := F;

end;

constructor Field.Init(FX, FY, FLen: integer; FName: string);

begin

X := FX;

Y := FY;

GetMem(Name, Length (FName) + 1);

Name^ := FName;

end;

constructor TStrField.Init(FX, FY, FLen: integer; FName: string);

begin

inherited Init(FX, FY, FLen, FName);

Field.Init(FX, FY, FLen, FName);

GetMem(Value, Len);

Value^ := '';

end;

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

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

destructor Field.Done;

begin

FreeMem(Name, Length (Name^) + 1);

end;

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