← Назад к вопросам

Какие знаешь модификаторы доступа?

1.6 Junior🔥 171 комментариев
#ООП и проектирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Модификаторы доступа в C++

Модификаторы доступа — это ключевые слова, которые контролируют видимость и доступность членов класса (полей и методов) из других частей программы. Они являются основным инструментом инкапсуляции и скрывают внутреннюю реализацию.

Три основных модификатора

1. public (открытый доступ)

Доступ: из любого места — класс, производные классы, внешний код

class BankAccount {
public:
    // Методы открытого интерфейса
    void deposit(double amount) {
        balance += amount;
    }
    
    double getBalance() const {
        return balance;
    }
    
private:
    double balance = 0.0;
};

// Использование из кода
BankAccount account;
account.deposit(100);  // OK - public
std::cout << account.getBalance();  // OK - public
// account.balance = 1000;  // ОШИБКА - private

Когда использовать: для публичного API класса, методов, которые должны быть доступны пользователям класса.

2. private (закрытый доступ)

Доступ: только внутри самого класса (НЕ в производных классах)

class LinkedListNode {
private:
    int data;
    LinkedListNode* next;
    
    // Приватные вспомогательные методы
    void deleteChain() {
        if (next) next->deleteChain();
        delete next;
    }
    
    friend class LinkedList;  // LinkedList может получить доступ
};

Особенности:

  • friend классы и функции могут получить доступ
  • Производные классы НЕ получают доступ
  • Используется для скрытия деталей реализации

Когда использовать: для внутренних полей, вспомогательных методов, которые не должны быть видны снаружи.

3. protected (защищённый доступ)

Доступ: внутри класса + производные классы, НО НЕ из внешнего кода

class Shape {
protected:
    double area;  // Доступна для производных классов
    
    virtual void recalculateArea() {
        // Вспомогательный метод для наследников
    }
    
public:
    virtual double getArea() const = 0;
    
private:
    int shapeId;
};

class Circle : public Shape {
public:
    void setRadius(double r) {
        radius = r;
        recalculateArea();  // OK - protected
        // area = 100;  // OK - можем использовать protected field
        // shapeId = 5;  // ОШИБКА - private не доступен
    }
    
protected:
    double radius;
    
private:
    void privateHelper() {}  // Свой приватный метод
};

Когда использовать: для внутреннего интерфейса наследников, когда нужно предоставить доступ производным классам, но скрыть от внешнего кода.

Таблица доступности

МодификаторВнутри классаПроизводные классыВнешний код
public
protected
private

Специальные случаи

Friend-функции и классы

class BankAccount {
private:
    double balance = 0.0;
    
    // Разрешаем функции и классам доступ к приватным членам
    friend void transferMoney(BankAccount& from, BankAccount& to, double amount);
    friend class AuditSystem;
};

void transferMoney(BankAccount& from, BankAccount& to, double amount) {
    // Может получить доступ к приватным полям
    if (from.balance >= amount) {
        from.balance -= amount;
        to.balance += amount;
    }
}

Важно: friendship не наследуется. Если класс B дружит с классом A, то это НЕ означает, что класс C (наследник B) дружит с A.

Модификаторы наследования

class Base { };

// Публичное наследование (рекомендуется)
class Derived : public Base { };  // public → public, protected → protected

// Приватное наследование (редко)
class Private : private Base { };  // Все public/protected становятся private

// Защищённое наследование
class Protected : protected Base { };  // public → protected

Best Practices

  1. По умолчанию приватное — начните с private, потом открывайте, что нужно
  2. Принцип наименьших привилегий — предоставляйте минимально необходимый доступ
  3. Используйте getters/setters — для контролируемого доступа к полям
  4. Документируйте намерения — объясняйте, почему члены public/protected
  5. Избегайте friend-функций где возможно — они нарушают инкапсуляцию

Модификаторы доступа — это стержень объектно-ориентированного проектирования, обеспечивающий надёжность, тестируемость и поддерживаемость кода.

Какие знаешь модификаторы доступа? | PrepBro