Что такое модификатор доступа private в C++?

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

Ответ

Ключевое слово private в C++ — это модификатор доступа, который определяет область видимости членов класса (полей данных и методов). Члены, объявленные в секции private, доступны только для методов самого этого класса и для его friend-функций или friend-классов. Они скрыты от любого внешнего кода, включая функции вне класса и методы производных классов.

Основная цель — инкапсуляция: Сокрытие внутренней реализации класса и защита его внутреннего состояния от некорректного или несанкционированного изменения извне. Это позволяет изменять реализацию класса, не ломая код, который его использует.

Пример:

#include <iostream>
#include <string>

class BankAccount {
private:
    // Внутреннее состояние — скрыто от внешнего мира
    std::string accountNumber;
    double balance;
    bool isActive;

    // Внутренний служебный метод — тоже скрыт
    void logTransaction(const std::string& type, double amount) {
        std::cout << "[" << accountNumber << "] " << type << ": " << amount << 'n';
    }

public:
    // Публичный интерфейс для взаимодействия
    BankAccount(const std::string& accNum, double initialDeposit)
        : accountNumber(accNum), balance(initialDeposit), isActive(true) {}

    void deposit(double amount) {
        if (amount > 0 && isActive) {
            balance += amount;
            logTransaction("DEPOSIT", amount);
        }
    }

    bool withdraw(double amount) {
        if (amount > 0 && isActive && balance >= amount) {
            balance -= amount;
            logTransaction("WITHDRAW", amount);
            return true;
        }
        return false;
    }

    double getBalance() const { // Геттер — безопасный доступ к private-полю
        return balance;
    }

    void deactivate() {
        isActive = false;
        std::cout << "Account " << accountNumber << " deactivated.n";
    }
};

int main() {
    BankAccount myAccount("ACC123", 1000.0);

    myAccount.deposit(500.0); // OK: публичный метод
    myAccount.withdraw(200.0); // OK: публичный метод
    std::cout << "Current balance: " << myAccount.getBalance() << 'n'; // OK: геттер

    // myAccount.balance = 1000000; // ОШИБКА КОМПИЛЯЦИИ: прямой доступ к private-полю
    // myAccount.logTransaction("HACK", 9999); // ОШИБКА: вызов private-метода

    return 0;
}

Важные детали:

  • Различие между class и struct: В class по умолчанию все члены являются private. В struct по умолчанию все члены являются public.
  • Наследование: При приватном наследовании (class Derived : private Base) все члены базового класса (и public, и protected) становятся private в производном классе. Это редко используется и обычно означает отношение "реализовано посредством" (implementation inheritance), а не "является" (is-a).
  • Дружественные объявления (friend): Позволяют предоставить доступ к private-членам конкретным внешним функциям или классам, нарушая инкапсуляцию в контролируемой точке. Следует использовать осмотрительно.