Ключове слово typedef

Іноді стомливо і нудно багаторазово повторювати запис таких ключових слів, як unsigned short int. (Крім того, в цих трьох словах нехитро наробити ще і купу помилок.) У мові C++ передбачена можливість створення псевдоніма для цієї фрази шляхом використання ключового слова typedef, яке означає визначення типу.

При створенні псевдоніма важливо відрізняти його від створення нового типу (про це піде мова на занятті 6). Щоб створити псевдонім типу даних, спочатку записується ключове слово typedef, за яким йде існуючий тип, а за ним нове ім'я з символом крапки з комою. Наприклад, при виконанні рядка

typedef unsigned short int USHORT;

створюється нове ім'я USHORT, яке можна використовувати скрізь, де треба визначити змінну типу unsigned short int. Лістинг 3.3 перероблений з лістингу 3.2 з використанням псевдоніма USHORT замість слів unsigned short int.

 

Лістинг 3.3. Приклад визначення типу за допомогою typedef

1: // * * * * * * * * * * * * * * * * *

2: // Приклад визначення типу за допомогою typedef

3: #include <iostream.h>

4:

5: typedef unsigned short int USHORT; //визначення псевдоніма

6:

7: int main()

8: {

9: USHORT Width = 5;

10: USHORT Length;

11: Length = 10;

12: USHORT Area = Width * Length;

13: cout << "Width:" << Width << "\n";

14: cout << "Length: " << Length << endl;

15: cout << "Area: " << Area << endl;

16: return 0;

17: }

 

Результат:

Width: 5

Length: 10

Area: 50

 

У рядку 5 ідентифікатор USHORT за допомогою ключового слова typedef визначений як псевдонім типу unsigned short int. У іншому ця програма аналогічна попередній, представленій в лістингу 3.2, та і результати роботи обох програм співпадають.

У яких випадках слід використовувати типи short і long

Початкуючим програмістам часто буває важко прийняти рішення про те, коли оголошувати змінну з використанням типу long, а коли - з використанням типу short. Правило досить просте: якщо існує хоч щонайменший шанс, що ваше значення буде занадто великим для передбачуваного типу, використовуйте тип з великим розміром.

Змінні типу unsigned short int, як правило, мають розмір, рівний двом байтам, і можуть зберігати значення, що не перевищує 65 535. Знакові короткі цілі ділять свій діапазон між позитивними і негативними числами, тому їх максимальне значення удвічі менше, ніж у беззнакового короткого цілого.

 

Хоча змінні типу unsigned long int можуть зберігати дуже велике число (4 294 967 295), воно все-таки кінцеве. Якщо вам треба працювати з ще більшими числами, доведеться перейти до використання типів float або double, але при цьому ви декілька програєте в точності. Змінні типу float і double можуть зберігати надзвичайно великі числа, але на більшості комп'ютерів значущими залишаються тільки перші 7 або 19 цифр, тобто після вказаної кількості цифр число округляється.

 

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

Для створення перерахування використовується ключове слово enum, за яким йдуть: ім'я типу, відкриваюча фігурна дужка, список константних значень, розділених комами, закриваюча фігурна дужка і крапка з комою. Наприклад:

enum COLOR { RED, BLUE, GREEN, WHITE, BLACK };

 

Цей вираз виконує два завдання.

1. Створюється перерахування з ім'ям C0L0R, що є новим типом.

2. Визначаються символьні константи: RED зі значенням 0; BLUE зі значенням 1; GREEN зі значенням 2 і так далі

Кожній константі перерахування відповідає певне цілочисельне значення. За умовчанням перша константа ініціалізувалася значенням 0, а кожна наступна - значенням, на одиницю великим попереднього. Проте будь-яку константу можна ініціалізувати довільним значенням, і в цьому випадку явно неініціалізовані константи продовжать зростаючу послідовність, узявши за точку відліку значення, що стоїть перед ними. Таким чином, якщо записати

 

enum Color { RED=100, BLUE, GREEN=500, WHITE, BLACK=700 };

те константа red матиме значення 100; константа blue - 101; константа GREEN - 500; константа WHITE - 501; константа BLACK - 700.

 

Тепер можна визначити змінні типу C0L0R, але кожною з них можна присвоїти тільки одне зі значень (в даному випадку RED, BLUE, GREEN, WHITE або BLACK або 100, 101, 500, 501 або 700), що перераховують. Змінній C0L0R можна присвоїти будь-яке значення кольору. Насправді цій змінній можна присвоїти будь-яке ціле значення, навіть якщо воно не відповідає жодному з дозволених кольорів, але в цьому випадку пристойний компілятор повинен обуритися і показати застережливе повідомлення. Важливо розуміти, що змінні перерахування насправді мають тип unsigned int і цілочисельним змінним привласнюються задані константи перерахування. Проте іноді при роботі з кольорами, днями тижня або іншими подібними наборами значень непогано мати можливість називати ці значення по імені. У лістингу 3.7 представлена програма, в якій використовується тип перерахування.

 

Лістинг 3.7. Використання перерахування

1: #include <iostream.h>

2: int main()

3: {

4: enum Days { Sunday, Monday, Tuesday

5: Wednesday, Thursday, Friday, Saturday };

6: int choice;

7: cout << "Enter a day (0-6) : ";

8: cin << choice;

9: if (choice = Sunday || choice == Saturday)

10: cout << "\nYou're already off on weekends!\n";

11: else

12: cout << "\nOkay, I'll put in the vacation day.\n";

13: return 0;

14: }

 

Результат:

Enter a day (0-6) : 6

You're already off on weekends!

 

Аналіз: В рядку 4 визначається перерахування DAYS з сім'ю константними значеннями. Усі вони утворюють зростаючу послідовність чисел, починаючи з нуля; таким чином, значення вівторка (Tuesday) дорівнює 2.

Користувачеві пропонується ввести значення між 0 і 6. Він не може ввести слово Sunday, оскільки в програмі не передбачений переклад символів в значення перерахування. Але можна перевірити введене користувачем значення, порівнявши його з константними значеннями перерахування, як показано в рядку 9. Використання перерахування полегшує аналіз програми. Того ж ефекту можна добитися, використовуючи константи цілочисельного типу, як показано в лістингу 3.8.

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

Лістинг 3.8. Та ж програма, але з використанням констант цілочисельного типу

 

1: #include <iostream.h>

2: int main()

3: {

4: const int Sunday = 0;

5: const int Monday = 1;

6: const int Tuesday = 2;

7: const int Wednesday = 3;

8: const int Thursday = 4;

9: const int Friday = 5;

10: const int Saturday = 6: 11;

12: int choice;

13: cout << "Enter a day (0-6) : ";

14: cin << choice;

15:

16: if (choice = Sunday || choice == Saturday)

17: cout << "\nYou're already off on weekends!\n";

18: else

19: cout << "\nOkay, I'll put in the vacation day.\n";

20:

21: return 0;

22: }

 

Результат:

Enter a day (0-6) : 6

You're already off on weekends!

 

Результати роботи цієї програми ідентичні результатам програми з лістингу 3.7. Але в цьому варіанті усі константи (Sunday, Monday і ін.) визначені в явному виді і відсутній тип перерахування Days. Зверніть увагу, що програма з перерахуванням коротша і логічніша.