{printf ("year=%d month=%d day=%d hour=%d\
minute=%d \n",p->year,p->month,p->day,\
p->hour,p->minute);}
Тоді при звертанні типу tt1.day компілятор видасть повідомлення про помилку.
Концепція закритих даних є значним кроком уперед з погляду теорії програмування. Адже в класичному процедурному програмуванні діє правило: дані формують код. Спочатку визначаються структури даних, з якими доводиться працювати, а потім пишуться функції для роботи з ними. При такому підході програма стає надзвичайно залежною від структур даних.
Припустимо, що ми написали велику кількість функцій, які працюють із полями структури Time. Згідно із цією структурою дата визначається так: рік, місяць, день, година, хвилина.
Однак дату можна зберігати й у секундах, використовуючи змінну типу long. Уявімо собі, скільки змін потрібно внести в програму, щоб реалізувати цю ідею, адже потрібно змінювати всі функції типу Display, усі оператори, які звертаються до полів. У випадку ж закритих даних змінити доведеться лише функції-члени структури, які працюють із закритими даними. Усе інше може залишитися без змін! Більше того, можна взагалі писати програму, визначаючи спочатку функціональний інтерфейс, і лише на останньому кроці визначати внутрішню структуру закритих даних. Обмеженість впливу даних на код є однією із суттєвих особливостей ООП.
|
|
Зазначимо, що структури та класи в С++ мають лише незначні відмінності у властивостях. Їх можна розглядати як синтаксично допустимий спосіб утворення типів даних користувача. У С++ ім'я структури чи класу – це тип даних. Якщо, наприклад, в ANSI C ми хочемо оголосити змінну типу struct Time, то можемо написати оголошення struct Time a;. Тут обов'язковим є ключове слово struct. У С++ слово struct не обов'язкове. Допускається еквівалентне оголошення типу Time а;. Для такого оголошення в ANSI C потрібно використовувати засіб typedef:
typedef struct Time {…};
Time a;
Опис протоколу класу
Розглянемо нові типи даних, що задаються за допомогою ключового слова class. Опис класу майже нічим не відрізняється від опису структури. У структурі Time з підрозд. 7.2 ми могли б описати аналогічний клас Time у такий спосіб:
class Timer {
private:
int year;
int month;
int day;
int hour;
int minute;
public:
void Display (void);};