Je vais ajouter aux réponses existantes car C++ moderne est maintenant une chose et officielle Directives de base ont été créés pour répondre à ce genre de questions.
Voici une section pertinente des directives :
C.2 : Utiliser class si la classe a un invariant ; utiliser struct si les membres de la donnée 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 publiques des membres puissent être assumées. 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 énoncé de manière informelle (par exemple, dans un commentaire) ou de manière plus formelle en utilisant Expects.
Si tous les membres des données peuvent varier indépendamment les uns des autres, aucun invariant n'est possible.
Si une classe possède des données privées, un utilisateur ne peut pas initialiser complètement un objet sans utiliser un constructeur. Par conséquent, le définisseur de la classe fournira un constructeur et devra spécifier sa signification. Cela signifie effectivement que le définisseur doit définir un invariant.
Application de la loi
Recherchez les structures dont toutes les données sont privées et les classes dont les membres sont 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 faciliter le contrôle d'intégrité lors de l'instanciation. Struct
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 en étant regroupés.
A partir de là, il est logique que class
es existent pour prendre en charge l'encapsulation et d'autres concepts de codage connexes, qui struct
ne sont tout simplement pas très utiles.