Я собираюсь добавить к существующим ответам, потому что современный C ++ теперь вещь, и официальные Основные рекомендации были созданы, чтобы помочь с такими вопросами как эти.
Вот соответствующий раздел из руководящих принципов:
C.2: использовать класс, если у класса есть инвариант; используйте struct, если члены данных могут варьироваться независимо
Инвариант - это логическое условие для членов объекта, которое конструктор должен установить для выполнения открытых функций-членов. После того, как инвариант установлен (обычно конструктором), для объекта может быть вызвана любая функция-член. Инвариант может быть задан неформально (например, в комментарии) или более формально с использованием Expect.
Если все элементы данных могут различаться независимо друг от друга, инвариант невозможен.
Если у класса есть какие-либо личные данные, пользователь не может полностью инициализировать объект без использования конструктора. Следовательно, определитель класса предоставит конструктор и должен указать его значение. Это фактически означает, что необходимо определить инвариант.
Исполнение
Поиск структур со всеми частными данными и классов с открытыми членами.
Приведены примеры кода:
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
хорошо работают для того, чтобы иметь «мешки с данными», где на самом деле ничего особенного не происходит, но члены логически имеют смысл объединяться в группы.
Исходя из этого, имеет смысл, что class
существуют для поддержки инкапсуляции и других связанных с этим концепций кодирования, что struct
просто не очень полезны для.