Какие модификаторы доступа к членам класса существуют в C++?

«Какие модификаторы доступа к членам класса существуют в C++?» — вопрос из категории ООП, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В C++ есть три модификатора доступа, которые определяют видимость членов класса (полей и методов):

  • public (открытый): Члены доступны из любого места программы — извне класса, из наследников, из других функций.
  • protected (защищенный): Члены доступны внутри самого класса и внутри классов-наследников (производных классов). Извне иерархии наследования доступ закрыт.
  • private (закрытый): Члены доступны только внутри того класса, где они объявлены. Это самый строгий уровень инкапсуляции.

Ключевое отличие между class и struct: По умолчанию, если модификатор не указан, в class члены являются private, а в structpublic. Это единственное синтаксическое различие.

Пример, демонстрирующий инкапсуляцию:

class BankAccount {
private:    // Данные скрыты от внешнего мира
    double balance;
    std::string accountNumber;

protected:  // Для возможного расширения в наследниках
    void logTransaction(const std::string& type) {
        // ... логирование
    }

public:     // Открытый интерфейс для клиентов
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            logTransaction("DEPOSIT");
        }
    }
    double getBalance() const { return balance; }
};

int main() {
    BankAccount acc;
    acc.deposit(100.0);          // OK: public метод
    // acc.balance = 1000;       // Ошибка компиляции: private член
    // acc.logTransaction("test"); // Ошибка компиляции: protected метод
}

Использование private позволяет защитить инварианты класса и изменять внутреннюю реализацию, не ломая код, который использует публичный интерфейс.