Можно ли объявить приватные (private) поля в структуре (struct) в C++?

«Можно ли объявить приватные (private) поля в структуре (struct) в C++?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в C++ структура (struct) и класс (class) практически идентичны. Единственное различие — умолчательный уровень доступа.

  • В class члены по умолчанию private.
  • В struct члены по умолчанию public.

После явного указания спецификатора доступа (private:, protected:, public:) они ведут себя одинаково.

Пример структуры с приватными полями:

#include <string>
#include <iostream>

struct Person {
    // Публичный интерфейс
    void setAge(int newAge) {
        if (newAge > 0 && newAge < 150) {
            age = newAge; // Доступ к приватному полю разрешён
        }
    }
    int getAge() const { return age; }

    void setName(const std::string& newName) { name = newName; }
    std::string getName() const { return name; }

private:
    // Приватные данные-члены
    int age;
    std::string name;
};

int main() {
    Person p;
    p.setName("Alice");
    p.setAge(30);
    // p.age = 30; // Ошибка компиляции: 'int Person::age' is private
    std::cout << p.getName() << " is " << p.getAge() << " years old.n";
    return 0;
}

Ключевые моменты:

  1. Использование struct с приватными полями оправдано, когда вы хотите подчеркнуть, что это простая структура данных, но с контролируемым доступом (инкапсуляция).
  2. В языке C структуры (struct) не поддерживают инкапсуляцию — все поля всегда публичны.
  3. В C++ выбор между struct и class часто является стилистическим для передачи намерения программиста.