Voy a agregar a las respuestas existentes porque el C ++ moderno ahora es una cosa y se han creado Pautas básicas oficiales para ayudar con preguntas como estas.
Aquí hay una sección relevante de las pautas:
C.2: Use class si la clase tiene una invariante; use struct si los miembros de datos pueden variar de forma independiente
Un invariante es una condición lógica para los miembros de un objeto que un constructor debe establecer para que asuman las funciones miembro públicas. Después de que se establece el invariante (normalmente por un constructor), se puede llamar a cada función miembro para el objeto. Un invariante puede expresarse de manera informal (por ejemplo, en un comentario) o más formalmente usando Expects.
Si todos los miembros de datos pueden variar independientemente unos de otros, no es posible una invariante.
Si una clase tiene datos privados, un usuario no puede inicializar completamente un objeto sin el uso de un constructor. Por lo tanto, el definidor de clase proporcionará un constructor y debe especificar su significado. Esto significa efectivamente que el definidor necesita definir un invariante.
Aplicación
Busque estructuras con todos los datos privados y clases con miembros públicos.
Los ejemplos de código dados:
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
Funcionan bien para miembros que, por ejemplo, se derivan entre sí o están interrelacionados. También pueden ayudar con la comprobación de la cordura al crear una instancia. Struct
Los s funcionan bien para tener "bolsas de datos", donde en realidad no ocurre nada especial, pero los miembros lógicamente tienen sentido estar agrupados.
A partir de esto, tiene sentido que class
existan s para admitir la encapsulación y otros conceptos de codificación relacionados, para los que struct
simplemente no son muy útiles.