-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUnion.cpp
More file actions
105 lines (97 loc) · 5.42 KB
/
Union.cpp
File metadata and controls
105 lines (97 loc) · 5.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/**
* \file Union.cpp
* \brief Объединения — это тип класса, в котором все данные разделяют одну и туже область памяти
*
* В языке c++ объединение может включать как функции-, так и данные- члены.
* Все члены объединения открыты по умолчанию. Для создания закрытых элементов необходимо использовать
* ключевое слово private. Общая форма объявления объединения выглядит следующим образом.
*
* union имя_класса
* {
* // Открытые члены по умолчанию.
* private:
* // Закрытые члены.
* } список_объектов;
*
*
* В языке C объединения могут содержать только данные-члены и ключевое слово private не поддерживается.
*
* Элементы объединения перекрывают друг друга. Например, в записи
*
* union tom
* {
* char ch;
* int x;
* } t;
*
* объявляется объединение tom, которое предполагает следующее расположение памяти
* (при использовании двухбайтовых целых).
*
*
* Как и в классе, на отдельные переменные, составляющие объединение, можно ссылаться с помощью
* оператора "точка". Оператор "стрелка" используется для доступа к объединению с помощью указателя.
*
* Применительно к объединениям существуют несколько ограничений. Объединение не может наследовать
* любые другие классы любого типа. Объединение не может быть базовым классом. Объединение не может
* иметь виртуальные функции-члены. Никакие члены не могут быть объявлены как статические. Объединение
* не может иметь в качестве члена объект, перегружающий оператор "равно" (=). Наконец ни какой объект
* не может быть членом объединения, если класс этого объекта явно определяет функцию конструктора
* или деструктора. (иначе говоря, приемлемы объекты, которые имеют только стандартные конструкторы
* и деструкторы.)
*
* В языке C++ существует специальный тип объединения, называемый анонимным объединением. В анонимном
* объединении не содержится имени класса и не объявляются никакие объекты. Анонимное объединение
* просто уведомляет компилятор о том, что его переменные-члены должны иметь одну и туже область
* памяти. Однако к самим переменным можно обращаться напрямую, не прибегая к обычному синтаксису
* операторов "точка" и "стрелка".
*
* union
* {
* int a;
* float f;
* };
*
* //...
*
* a = 10; //доступ к переменной a
* cout << f; //доступ к переменной f
*
* Анонимные объединения должны содержать только данные, никакие функции-члены не допускаются.
* Анонимное объединение, действующее в области видимости, определённой с заданным пространством имён
* (namespace), должно быть объявлено с использованием модификатора типа данных static.
*/
#include <StdStream/StdStream.h>
#include <StdTest/StdTest.h>
#include <Stl.h>
//-------------------------------------------------------------------------------------------------
union Printer
{
int i;
float f;
char c;
const char *s;
};
//-------------------------------------------------------------------------------------------------
int main(int, char **)
{
// Элементы объединения перекрывают друг друга
Printer printer {};
printer.i = 1978;
printer.f = 7.0f;
printer.c = 'a';
printer.s = "xxx";
std::cout
<< STD_TRACE_VAR(printer.i) << "\n"
<< STD_TRACE_VAR(printer.f) << "\n"
<< STD_TRACE_VAR(printer.c) << "\n"
<< STD_TRACE_VAR(printer.s) << "\n";
return EXIT_SUCCESS;
}
//-------------------------------------------------------------------------------------------------
#if OUTPUT
printer.i: -768295720
printer.f: -1.94066e+11
printer.c: �
printer.s: xxx
#endif
//-------------------------------------------------------------------------------------------------