Типи даних користувача

Описані раніше вбудовані типи даних мови C++ можуть бути доповнені новими типами даних, визначеними самим користувачем. Типи даних користувача діляться на три групи: переліки, структури й об'єднання.

Список елементів, що входять в тип даних користувача, завжди береться в фігурні дужки. Услід за оголошенням нового типу відразу ж за закриваючою фігурною дужкою може слідувати оголошення одної або декількох змінних (об'єктів) цього типу. Ознакою, що оголошення змінних (об'єктів) відсутні, є наявність крапки з комою відразу за закриваючою дужкою.

2.5.1 Переліки

При використанні обмеженого числа логічно зв'язаних пойменованих констант зручно користуватися переліками. Перелік (enum) – це тип даних, який задає перелік значень та їх змістовних назв. Оголошення переліку має наступний формат:

 

enum enum_name

{

item1_name[= ціле_значення1],

item2_name[= ціле_значення2],

itemN_name[= ціле_значенняN]

};

 

Тут квадратні дужки позначають необов'язкові елементи оголошення, тобто цілі значення пойменованим константам можуть не задаватися. Якщо для якогось елементу значення не задано, йому присвоюється значення на одиницю більше, ніж попередньому елементу. Для першого елементу в списку за умовчанням присвоюється нульове значення.

Ім'я переліку enum_name в оголошенні також може бути відсутнім. В цьому випадку перелік є просто оголошенням списку пойменованих констант. Інакше, якщо ім'я переліку задано, воно стає ім'ям нового типу даних користувача – переліку з цим ім'ям.

Наприклад:

 

enum {ASM, AUTO, BREAK};

 

Тут оголошені три цілі константи, які називаються елементами переліку, і їм присвоєні значення. Оскільки за умовчанням значення елементів переліку починаються з 0 і йдуть в зростаючому порядку, то наведений перелік еквівалентний оголошенням:

 

const ASM = 0;

const AUTO = 1;

const BREAK = 2;

 

Попередньому переліку могло бути присвоєне ім'я, наприклад:

 

enum keyword {ASM, AUTO, BREAK};

 

Ім'я переліку keyword стає ім'ям нового типу.

За допомогою стандартних приведень тип переліку може неявно приводитися до типу int. Зворотне приведення (з типу int в перелік) повинно бути задано явно. Наприклад:

 

void f()

{

keyword k = ASM;

int i = 0;

k = i; // помилка

k = keyword(i);

i = k;

k = 4; // помилка

}

 

Останнє присвоювання пояснює, чому немає неявного приведення з int в перелік: більшість значень типу int не має представлення в даному переліку.

Описуючи змінну з типом keyword замість очевидного int, користувачу, як і компілятору, дається інформація про те, як використовуватиметься ця змінна. Наприклад, для наступного фрагменту програми:

 

keyword key;

switch (key)

{

case ASM:

// виконати що-небудь

break;

case BREAK:

// виконати що-небудь

break;

}

 

компілятор може видати попередження, оскільки з трьох можливих значень типу keyword використовуються тільки два.

Приклад переліку з явно заданими значеннями:

 

enum int16

{

sign=0100000,

most_significant=040000,

least_significant=1

};

 

Значення, що задаються, необов'язково повинні бути різними, позитивними і йти в зростаючому порядку. Наприклад:

 

enum Suit

{

Diamonds = 5,

Hearts,

Clubs = 4,

Spades

};

 

Значення констант Diamonds, Hearts, Clubs і Spades будуть 5, 6, 4, і 5 відповідно. Слід зауважити, що 5 присвоєно двом елементам: Diamonds і Spades.