Используйте `class`, если класс имеет инвариант; используйте `struct`, если члены данных могут изменяться независимо
Причина
Читаемость. Лёгкость понимания. Использование class предупреждает программиста о необходимости инварианта. Это полезное соглашение.
Примечание
Инвариант — это логическое условие для членов объекта, которое конструктор должен установить для того, чтобы публичные функции-члены могли на него полагаться. После того как инвариант установлен (обычно конструктором), для объекта можно вызывать любую функцию-член. Инвариант может быть сформулирован неформально (например, в комментарии) или более формально с помощью Expects.
Если все члены данных могут изменяться независимо друг от друга, инвариант невозможен.
Пример
struct Pair { // члены могут изменяться независимо
string name;
int volume;
};
но:
class Date {
public:
// проверить, что {yy, mm, dd} — допустимая дата, и инициализировать
Date(int yy, Month mm, char dd);
// ...
private:
int y;
Month m;
char d; // день
};
Примечание
Если класс имеет какие-либо private данные, пользователь не может полностью инициализировать объект без конструктора. Поэтому разработчик класса должен предоставить конструктор и определить его смысл. Это фактически означает, что разработчику нужно определить инвариант.
Смотрите также:
- определяйте класс с private данными как
class - Предпочитайте размещать интерфейс первым в классе
- минимизируйте доступность членов
- Избегайте
protectedданных
Контроль
Ищите struct-ы со всеми private данными и class-ы с public членами.