{printf ("year=%d month=%d day=%d hour=%d\
minute=%d \n",p->year,p->month,p->day,\
p->hour,p->minute);}
Що ж ми отримали? Зробивши функцію членом структури, ми не здобули нових можливостей. Адже будь-яка зовнішня функція має вільний доступ до полів даних структури (через операцію "."). Усе те, що можна робити з даними за допомогою функції-члена структури, можна робити й за допомогою зовнішніх функцій. Проте в семантичному плані це є безсумнівним досягненням. Об'єднання даних і функцій, що працюють з ними в одній структурі – це приклад інкапсуляції.
Функція-член структури стає ніби властивістю структури. Що ж це за структура, що має якісь властивості? Де її можна використовувати? Очевидно, що такі структури могли б бути корисними для моделювання реальних природних об'єктів. У нашому випадку, наприклад, структура Time з функцією-членом Display може служити моделлю годинника (об'єкта, при звертанні до якого ми отримуємо інформацію про час і дату). Однак очевидно, що природні об'єкти мають дані, приховані від певних зовнішніх об'єктів.
Наприклад, спостерігаючи за літаком, можна визначити його швидкість, висоту, тип, але не можна ззовні визначити, скільки в нього залишилося пального й боєприпасів. Звідси випливає, що деякі поля даних мають бути закритими. Звертання до цих полів за допомогою операції ". " синтаксично недопустиме. Виходячи з поняття інкапсуляції, приходимо до концепції закритих полів даних. У С++ існують спеціальні службові слова – специфікатори доступу: public, protected та private. Дані, розміщені в розділах protected та private, стають доступними лише для функцій-членів і недоступними для зовнішніх функцій. Доступ до них може здійснюватися лише за допомогою функцій, описаних у відкритому розділі.
Оголосимо поля даних закритими:
struct Time {
private:
int year;
int month;
int day;
int hour;
int minute;
public:
void Display (void);} tt1;