Опубликован: 01.11.2004 | Уровень: для всех | Доступ: свободно | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 8:

Производные типы данных языка C++. Структуры, объединения и перечисления

< Лекция 7 || Лекция 8: 123 || Лекция 9 >

Объединения

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

Использование объединений значительно экономит память, выделяемую под объекты.

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

Так, компилятор Visual C++ выделит 4 байта под следующее объединение:

union unionA { 
    char ch1; 
    float f1;} a1;
Элементы объединения
Количество занимаемых байтов char ch1
1
float f1
1 2 3 4

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

Инициализировать объединение при его объявлении можно только заданием значения первого элемента объединения.

Например:

union unionA { 
    char ch1; 
  float f1;} a1={ 'M' };

Доступ к элементам объединения, аналогично доступу к элементам структур, выполняется с помощью операторов . и ->.

Например:

union TypeNum
{
   int    i;
   long  l;  
   float  f;  
};
   union TypeNum vNum = { 1 }; 
   // Инициализация первого элемента объединения i = 1
   cout<< vNum.i;
   vNum.f = 4.13;
   cout<< vNum.f;

Элементы объединения не могут иметь модификаторов доступа и всегда реализуются как общедоступные ( public ).

Перечисления

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

Перечисление задает для каждого мнемонического названия в указываемом множестве свой индекс.

Перечисление может иметь следующее формальное описание:

enum имя_типа {список_значений} 
    список_объявляемых_переменных;
enum имя_типа список_объявляемых_переменных;
enum (список_элемент=значение);

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

Значение каждого нумератора определяется как значение типа int. По умолчанию первый нумератор определяется значением 0, второй - значением 1 и т.д. Для инициализации значений нумератора не с 0, а с другого целочисленного значения, следует присвоить это значение первому элементу списка значений перечислимого типа.

Например:

// Создание перечисления
enum eDay{sn, mn, ts, wd, th, fr, st} day1;
    // переменная day1 будет принимать 
    // значения в диапазоне от 0 до 6
day1=st;       
    // day1 - переменная перечислимого типа
int i1=sn;   
    // i1 будет равно 0
day1= eDay(0);      
    // eDay(0) равно значению sn
enum(color1=255);        
    // Объявление перечисления, определяющего
    // именованную целую константу color1
int icolor=color1;
enum eDay2{sn=1, mn, ts, wd, th, fr, st} day2;
    // переменная day2 будет принимать 
    // значения в диапазоне от 1 до 7

Для перечислимого типа существует понятие диапазона значений, определяемого как диапазон целочисленных значений, которые может принимать переменная данного перечислимого типа.

Для перечислимого типа можно создавать указатели.

< Лекция 7 || Лекция 8: 123 || Лекция 9 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);