С++ для начинающих



         

Объединение – класс, экономящий память - часть 2


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

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

union TokenValue {

   char _cval;

   int _ival;

   char *_sval;

   double _dval;

};

Если самым большим типом среди всех членов TokenValue является dval, то размер TokenValue будет равен размеру объекта типа double. По умолчанию члены объединения открыты. Имя объединения можно использовать в программе всюду, где допустимо имя класса:

// объект типа TokenValue

TokenValue last_token;

// указатель на объект типа TokenValue

TokenValue *pt = new TokenValue;

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

last_token._ival = 97;

char ch = pt->_cval;

Члены объединения можно объявлять открытыми, закрытыми или защищенными:

union TokenValue {

public:

   char _cval;

   // ...

private:

   int priv;

}

int main() {

   TokenValue tp;

   tp._cval = '\n';   // правильно

   // ошибка: main() не может обращаться к закрытому члену

   //         TokenValue::priv

   tp.priv = 1024;

}

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

union illegal_members {

   Screen s;      // ошибка: есть конструктор

   Screen *ps;    // правильно

   static int is; // ошибка: статический член

   int &rfi;      // ошибка: член-ссылка

};

Для объединения разрешается определять функции-члены, включая конструкторы и деструкторы:




Содержание  Назад  Вперед