Я збираюся додати до існуючих відповідей, тому що сучасний 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
існують для підтримки інкапсуляції та інших пов'язаних з цим концепцій кодування, для struct
яких просто не дуже корисно.