Aggiungerò le risposte esistenti perché il moderno C ++ è ora una cosa e sono state create linee guida di base ufficiali per aiutare con domande come queste.
Ecco una sezione pertinente delle linee guida:
C.2: Usa classe se la classe ha un invariante; utilizzare struct se i membri dei dati possono variare indipendentemente
Un invariante è una condizione logica per i membri di un oggetto che un costruttore deve stabilire affinché le funzioni membro pubbliche assumano. Dopo che l'invariante è stato stabilito (in genere da un costruttore), ogni funzione membro può essere chiamata per l'oggetto. Un invariante può essere dichiarato informalmente (ad esempio, in un commento) o più formalmente utilizzando Expects.
Se tutti i membri dei dati possono variare indipendentemente l'uno dall'altro, non è possibile alcuna invariante.
Se una classe ha dati privati, un utente non può inizializzare completamente un oggetto senza l'uso di un costruttore. Quindi, il definitore della classe fornirà un costruttore e dovrà specificarne il significato. Ciò significa effettivamente che il definitore deve definire un invariante.
Rinforzo
Cerca strutture con tutti i dati privati e classi con membri pubblici.
Gli esempi di codice forniti:
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
Funzionano bene per i membri che, ad esempio, derivano l'uno dall'altro o sono correlati. Possono anche aiutare con il controllo della sanità mentale durante l'istanza. Struct
Funzionano bene per avere "sacchi di dati", in cui non succede niente di speciale ma i membri hanno logicamente senso essere raggruppati insieme.
Da questo, ha senso che class
es esistano per supportare l'incapsulamento e altri concetti di codifica correlati, che struct
semplicemente non sono molto utili.