401 votos

Cuándo se debe utilizar una clase frente a un struct en C++?

¿En qué casos es mejor usar un struct frente a una clase en C++?

376voto

Commodore Jaeger Puntos 11949

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.

95voto

quark Puntos 7773

Como todos los demás notas realmente sólo hay dos diferencias de idioma:

  • struct valores predeterminados para el acceso público y class valores predeterminados para el acceso privado.
  • Cuando hereda de ellos, struct predeterminado es public de la herencia y class predeterminado es private 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 declare structs 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 structs para POD tipos, y, si se va a agregar los métodos en todo, classes. 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++?)

44voto

Ferruccio Puntos 51508

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());

21voto

Tal Pressman Puntos 4120

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.

10voto

mbyrne215 Puntos 827

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.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X