Объединения
Объединения — это тип класса, в котором все данные разделяют одну и туже область памяти. В языке 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.
Смотрите также
|
2018-04-22 15:15:36 Зачем? Можете привести пример практического применения объединений? Или хотя бы прокомментировать мою версию. Допустим, мы объединим две схожие структуры, а использовать будем только одну, с вероятностью 50 на 50, но точно не знаем какая пригодится, то для экономии памяти можно будет воспользоваться таким способом. Найдутся ли другие примеры? 2018-05-04 14:40:10 для работы с битами typedef unsigned char byte; union{ int a; byte b[4]; } 2018-05-20 07:01:28 Тимур В SDL они используются для событий. Это хороший выбор, на мой взгляд. http://wiki.libsdl.org/SDL_WindowEvent 2018-05-20 07:02:31 Тимур Ошибся ссылкой. http://wiki.libsdl.org/SDL_Event 2018-05-20 07:04:47 Тимур Можно добавить в описание, что размер объединения определяется размером его максимального члена. 2020-03-20 14:41:09 timh <h1>круть</h1> Оставить комментарий: |