Обычные объединения

Объединения

Else

cout << setw(14) << "Пол: " << "Ж\n";

cout << setw(14) << "Средний балл: " << S.Grade << endl;

}

 

Вызов этой функции: WriteStudent ( St1 );

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

Важным здесь является то, что при использовании ссылочных параметров структурных типов доступ к членам структуры осуществляется обычным способом – с помощью оператора “точка”.

 

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

void WriteStudent ( const t_Student &S )

{

………..

}

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

 

union t_num {

int i;

double d;

};

 

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

Для работы с объединением следует определить соответствующие переменные:

 

t_num A, B; //Определены две переменныеАиВ

Создание переменных модно совместить с описанием объединения:

 

union t_num {

int i;

double d;

} A, B;// Описан тип данных t_num и определены две переменныеАиВ

 

Обращение к полям объединения осуществляется так же, как и к элементам структуры – с использованием оператора “точка”:

 

A.i = 13;

B.d = 3.14;

cout << A.i + B.d;

 

Если обращение к полям объединения осуществляется через указатель, то необходимо использовать оператор “стрелка”:

 

t_num *p = &A;// Указатель на объединение р инициализирован адресом переменной А

p -> d = 234.33; //Полю d переменной А присвоено новое значение

 

Передача объединений в качестве аргументов функций осуществляется точно так же, как и для структур.

В памяти члены объединения “накрывают” друг друга (располагаются по одному адресу):

d (double – 8 байт)
i (int – 4 байта)
А

 

Если вывести на экран адреса переменной А и полей i и d

 

cout << &A << " " << &A.i << " " << &A.d << endl;

то будут выведены три одинаковых адреса.

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

Например, необходимо написать функцию обеспечивающую перестановку младшего и старшего байта короткого целого: