Я собираюсь добавить к существующим ответам, потому что современный C ++ теперь в ходу , и были созданы официальные основные рекомендации , чтобы помочь с такими вопросами.
Вот соответствующий раздел из рекомендаций:
C.2: использовать класс, если у класса есть инвариант; используйте структуру, если элементы данных могут изменяться независимо
Инвариант - это логическое условие для членов объекта, которое конструктор должен установить для принятия общедоступных функций-членов. После того, как инвариант установлен (обычно конструктором), для объекта может быть вызвана каждая функция-член. Инвариант можно указать неформально (например, в комментарии) или более формально, используя Ожидаемые данные.
Если все элементы данных могут изменяться независимо друг от друга, инвариант невозможен.
Если у класса есть какие-либо частные данные, пользователь не может полностью инициализировать объект без использования конструктора. Следовательно, определитель класса предоставит конструктор и должен указать его значение. Это фактически означает, что разработчику необходимо определить инвариант.
Исполнение
Ищите структуры со всеми данными частными и классы с открытыми членами.
Приведены примеры кода:
struct Pair { // the members can vary independently
string name;
int volume;
};
// but
class Date {
public:
// validate that {yy, mm, dd} is a valid date and initialize
Date(int yy, Month mm, char dd);
// ...
private:
int y;
Month m;
char d; // day
};
Class
Они хорошо подходят для членов, которые, например, являются производными друг от друга или взаимосвязаны. Они также могут помочь с проверкой работоспособности при создании экземпляра. Struct
s хорошо подходят для «мешков с данными», где на самом деле ничего особенного не происходит, но члены логически имеют смысл сгруппироваться вместе.
Отсюда логично, что class
es существуют для поддержки инкапсуляции и других связанных концепций кодирования, для которых struct
они просто не очень полезны.