Инкапсуляция. Спецификаторы доступа к полям классов

Инкапсуляция — механизм языка C++, ограничивающий доступ к составляющим объект компонентам (методам и атрибутам), делает их защищенными или приватными, то есть доступными только внутри объекта.

Возможность сокрытия части "внутренностей" класса необходима для создания интерфейса класса, определяющего допустимые действия с объектом.

Например, если

struct Student{
    int age;
    void aging() {
        age++;
        cout << "Happy birthday! New age: " << age << endl;
    }
};

Допустим, мы хотим, чтобы при увеличении возраста студента выводилось поздравление.

В данный момент наличие метода aging() не исключает прямого изменения атрибута age, так как члены класса, описанного со служебным словом класса struct, по умолчанию считаются общими (public). В результате возможно как правильное, так и неправильное использование экземпляра нашего класса.

Управление доступом к частям класса осуществляется при помощи трех квалификаторов:

Можно поставить их так:

struct Student{
private:
    int age;
public:
    void aging() {
        age++;
        cout << "Happy birthday! New age: " << age << endl;
    }
};

Тогда компилятор будет отслеживать попытки изменить age напрямую:

Student s;
s.age = 10; //Ошибка! Попытка доступа к приватной части класса!
s.aging(); //Всё в порядке, вызов публичного метода.

Чтобы реализовать принцип икапсуляции в полной мере, все члены класса по умолчанию должны быть сокрытыми, а не публичными. Именно этим отличаются С++-структуры и классы. Класс tStudent можно описать с ключевым словом class.

class Student{
    int age; //по умолчанию является private
public:
    void aging() {
        age++;
        cout << "Happy birthday! New age: " << age << endl;
    }
};

Методам данного класса доступны все, и скрытые, и публичные атрибуты и методы, так как они "свои".