Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP2 (1).doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
350.21 Кб
Скачать

37) Объединения

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

этих полей, кроме требования, чтобы они помещались в объеме машинного слова, в типичных применениях

поля битов служат для хранения целых данных (чаще типа unsigned).

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

битах, например: unsigned status: 6;.

Если имя поля опущено, то создается скрытое поле. Если размер поля битов представлен числом 0, то

следующее поле битов начнется с границы машинного слова.

Структура данных объединение подобна структуре, однако в каждый момент времени может использоваться

(является активным) только один из его компонентов. Шаблон объединения может задаваться записью вида:

union

{

<имя типа1> <компонента1>;

<имя типа2> <компонента2>;

. . .

<имя типаN> <компонентаN>;

};

Поля структуры размещаются в оперативной памяти одно за другим в той последовательности, в которой

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

следовательно, накладываются друг на друга.

Доступ к компонентам объединения осуществляется тем же способом, что и к компонентам структур.

Пример.

#include <iostream.h>

void main ()

{

union Nata

{

int a;

char b;

} kkk;

kkk.a = 123;

cout << kkk.a; }

Текст этой программы можно взять здесь.

В качестве примера объекта типа union рассмотрим объединение geom_fig[1]:

union

{

int radius; // Окружность.

int a[2]; // Прямоугольник.

int b[3]; // Треугольник.

} geom_fig;

В этом примере обрабатывается только активный компонент, то есть компонент, который последним

получает свое значение. Например, после присваивания значения компоненту radius не имеет смысла

обращение к массиву b.

Обратите внимание на то, что на одних компьютерах поля битов размещаются слева направо, на других -

справа налево. Это значит, что при всей полезности работы с ними, если формат данных, с которыми мы имеем

дело, дан нам свыше, то необходимо самым тщательным образом исследовать порядок расположения полей;

программы, зависящие от такого рода вещей, не переносимы.

Объединения применяются для:

 минимизации используемого объема памяти, если в каждый момент времени только один объект из

многих является активным;

 интерпретации основного представления объекта одного типа, как если бы этому объекту был присвоен

другой тип.

Таким образом, после задания рассмотренной структуры данных в программе будет находиться переменная,

которая на законных основаниях может хранить "в себе" значения нескольких типов.

43.1 Инициализация. Объединение - это еще один структурированный тип данных. Объединение похоже на

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

слово union.

union имя_типа {определения_элементов};

Объединение отличается от структуры способом организации во внутренней памяти. Все элементы

объединения в памяти начинаются с одного байта.

Пусть в программе описана структура:

struct S

{ int i; char ch; long int L;

};

Расположение ее элементов в памяти будет следующим:

байт байт | байт | байт байт байт байт

i | ch | L

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

размер структуры равен сумме длин полей.

А теперь рассмотрим объединение со следующим описанием:

union S

{ int i; char ch; long int L;

};

Величина с таким типом в памяти будет расположена следующим образом:

байт | байт | байт | байт |

ch |

i |

L |

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

большого поля.

Изменение значения любого поля объединения меняет значения других полей.

38) Для осуществления операций с файлами предусмотрено три класса: ifstream, ofstream и fstream. Эти классы являются производными, соответственно, от классов istream, ostream и iostream. Поскольку эти последние классы, в свою очередь, являются производными от класса ios, классы файловых потоков наследуют все функциональные возможности своих родителей (перегруженные операции << и >> для встроенных типов, функции и флаги форматирования, манипуляторы и пр.). Для реализации файлового ввода-вывода нужно включить в программу заголовочный файл fstream.h.

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

Для создания файлового потока эти классы предусматривают следующие формы конструктора:

создать поток, не связывая его с файлом:

ifstream();      ofstream();      fstream();

создать поток, открыть файл и связать поток с файлом:

ifstream(const char *name, ios::openmode mode = ios::in) ;      ofstream(const char* name, ios::openmode mode=ios::out | ios::trunc);      fstream(const char * name, ios::openmode mode = ios::in | ios::out);

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

fstream fs("FileName.dat");

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

void ifstream::open(const char *name, ios::openmode mode = ios::in);      void ofstream::open      (const char * name, ios::openmode mode = ios::out | ios::trunc);      void fstream::open      (const char * name, ios::openmode mode = ios::in | ios::out);

Здесь name - имя файла, mode - режим открытия файла. Параметр mode является перечислением и может принимать значения, указанные в табл. 8.

Таблица 8

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