Ответ
Ключевое слово 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-членам конкретным внешним функциям или классам, нарушая инкапсуляцию в контролируемой точке. Следует использовать осмотрительно.