Je vais ajouter aux réponses existantes car le C ++ moderne est maintenant une chose et des directives de base officielles ont été créées pour aider avec des questions comme celles-ci.
Voici une section pertinente des directives:
C.2: Utiliser la classe si la classe a un invariant; utiliser struct si les données membres peuvent varier indépendamment
Un invariant est une condition logique pour les membres d'un objet qu'un constructeur doit établir pour que les fonctions membres publiques prennent en charge. Une fois l'invariant établi (généralement par un constructeur), chaque fonction membre peut être appelée pour l'objet. Un invariant peut être indiqué de manière informelle (par exemple, dans un commentaire) ou plus formellement en utilisant Expects.
Si tous les membres de données peuvent varier indépendamment les uns des autres, aucun invariant n'est possible.
Si une classe a des données privées, un utilisateur ne peut pas complètement initialiser un objet sans l'utilisation d'un constructeur. Par conséquent, le définisseur de classe fournira un constructeur et doit spécifier sa signification. Cela signifie effectivement que le définisseur doit définir un invariant.
Mise en vigueur
Recherchez des structures avec toutes les données privées et des classes avec des membres publics.
Les exemples de code donnés:
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
es fonctionnent bien pour les membres qui sont, par exemple, dérivés les uns des autres ou interdépendants. Ils peuvent également aider à vérifier la cohérence lors de l'instanciation. Struct
s fonctionnent bien pour avoir des «sacs de données», où rien de spécial ne se passe vraiment mais où les membres ont logiquement un sens à être regroupés.
À partir de là, il est logique que class
es existent pour prendre en charge l'encapsulation et d'autres concepts de codage associés, pour lesquels les struct
s ne sont tout simplement pas très utiles.