¿En qué casos es mejor usar un struct frente a una clase en C++?
Respuestas
¿Demasiados anuncios?La única diferencia entre una clase y una struct en C++, es que las estructuras tienen por defecto los miembros públicos y las bases y de las clases que tienen por defecto los miembros del sector privado y de las bases. Tanto las clases y estructuras puede tener una mezcla de los miembros públicos y privados, puede utilizar la herencia, y puede tener funciones miembro.
Me gustaría recomendar el uso de estructuras como llano-viejo-estructuras de datos sin ninguna clase de características similares, y a través de clases como agregado de estructuras de datos con los datos privados y funciones miembro.
Como todos los demás notas realmente sólo hay dos diferencias de idioma:
-
struct
valores predeterminados para el acceso público yclass
valores predeterminados para el acceso privado. - Cuando hereda de ellos,
struct
predeterminado espublic
de la herencia yclass
predeterminado esprivate
de la herencia. (Irónicamente, como con tantas cosas en C++, el valor predeterminado es al revés:public
de la herencia es por lejos el más común, pero la gente rara vez se declarestruct
s sólo para guardar en escribir el "public
" palabra clave.
Pero la verdadera diferencia en la práctica entre un class
/struct
que declara que un constructor/destructor y uno que no. Hay ciertas garantías para un "simple-antiguo-data" POD tipo, que ya no se aplican una vez que usted se haga cargo de la clase de la construcción. Para mantener esta distinción claro, muchas personas deliberadamente sólo uso struct
s para POD tipos, y, si se va a agregar los métodos en todo, class
es. La diferencia entre los dos fragmentos a continuación de otro modo es absurdo:
class X
{
public:
// ...
};
struct X
{
// ...
};
(Por cierto, aquí un hilo con algunas buenas explicaciones acerca de lo que "tipo de POD" en realidad significa: Lo que se POD de tipos en C++?)
La única vez que el uso de una estructura en lugar de una clase es cuando se declara un functor a la derecha antes de usarlo en una llamada de función y desea minimizar la sintaxis para el bien de la claridad. por ej.:
struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare());
Desde el C++ FAQ:
Los miembros de clases base y de una estructura son públicos por defecto, mientras que en la clase, que de forma predeterminada a los privados. Nota: usted debe hacer su base de clases explícitamente públicos, privados o protegidos, en lugar de depender de los valores predeterminados.
estructura y clase de lo contrario son funcionalmente equivalentes.
OK, suficiente de que absolutamente limpio techno hablar. Emocionalmente, la mayoría de los desarrolladores de hacer una fuerte distinción entre una clase y una estructura. Una estructura que simplemente se siente como un montón de bits con muy poco en el camino de la encapsulación o funcionalidad. Una clase se siente como un ser vivo y miembro responsable de la sociedad con servicios de inteligencia, un fuerte de la encapsulación de la barrera, y una interfaz bien definida. Desde esa es la connotación que la mayoría de la gente ya tiene, usted probablemente debería usar la palabra clave struct si usted tiene una clase que tiene muy pocos métodos y cuenta pública de datos (tales cosas existen en bien diseñado sistemas!), pero de lo contrario, usted probablemente debería usar la palabra clave class.
Un lugar donde una estructura que ha sido de gran ayuda para mí es cuando tengo un sistema que está recibiendo fija el formato de los mensajes (más decir, un puerto serie) de otro sistema. Usted puede emitir la secuencia de bytes en una estructura que define sus campos y, a continuación, facilidad de acceso a los campos.
typedef struct
{
int messageId;
int messageCounter;
int messageData;
} tMessageType
void processMessage(unsigned char *rawMessage)
{
tMessageType *messageFields = (tMessageType *)rawMessage;
printf("Id is %d\n", messageFields.messageId);
}
Obviamente, esto es lo mismo que se haría en C, pero me parece que la sobrecarga de tener que decodificar el mensaje en una clase es generalmente no vale la pena.