c++ codigo clases - ¿Cuándo deberías usar una clase vs una estructura en C ++?





12 Answers

Como todos los demás señalan, en realidad solo hay dos diferencias reales de idioma:

  • struct defecto acceso público y la class defecto es acceso privado.
  • Al heredar, struct valores predeterminados a herencia public y class valores predeterminados a herencia private . (Irónicamente, como ocurre con muchas cosas en C ++, el valor predeterminado es al revés: public herencia public es, con mucho, la opción más común, pero las personas rara vez declaran las struct solo para ahorrar al escribir la palabra clave " public ".

Pero la diferencia real en la práctica es entre una class / struct que declara un constructor / destructor y una que no lo hace. Hay ciertas garantías para un tipo de POD de "datos antiguos" que ya no se aplican una vez que se hace cargo de la construcción de la clase. Para mantener clara esta distinción, muchas personas solo usan struct para los tipos de POD y, si van a agregar algún método, usan las class . La diferencia entre los dos fragmentos a continuación no tiene sentido:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(Por cierto, aquí hay un hilo con algunas buenas explicaciones sobre lo que realmente significa "tipo de POD": ¿Qué son los tipos de POD en C ++? )

estructuras anidadas lenguaje

¿En qué situaciones es mejor usar una struct vs una class en C ++?




La única vez que uso una estructura en lugar de una clase es cuando declaro un funtor justo antes de usarlo en una llamada de función y quiero minimizar la sintaxis para mayor claridad. p.ej:

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 



Un lugar donde una estructura me ha sido útil es cuando tengo un sistema que recibe mensajes de formato fijo (por ejemplo, un puerto serie) de otro sistema. Puede convertir el flujo de bytes en una estructura que define sus campos y luego acceder fácilmente a los campos.

typedef struct
{
    int messageId;
    int messageCounter;
    int messageData;
} tMessageType;

void processMessage(unsigned char *rawMessage)
{
    tMessageType *messageFields = (tMessageType *)rawMessage;
    printf("MessageId is %d\n", messageFields->messageId);
}

Obviamente, esto es lo mismo que haría en C, pero creo que la sobrecarga de tener que descifrar el mensaje en una clase generalmente no vale la pena.




Como todos dicen, la única diferencia real es el acceso predeterminado. Pero particularmente uso struct cuando no quiero ningún tipo de encapsulación con una clase de datos simple, incluso si implemento algunos métodos de ayuda. Por ejemplo, cuando necesito algo como esto:

struct myvec {
    int x;
    int y;
    int z;

    int length() {return x+y+z;}
};



Para C ++, realmente no hay mucha diferencia entre estructuras y clases. La principal diferencia funcional es que los miembros de una estructura son públicos por defecto, mientras que son privados por defecto en las clases. De lo contrario, en lo que se refiere al idioma, son equivalentes.

Dicho esto, tiendo a usar estructuras en C ++ como lo hago en C #, similar a lo que Brian ha dicho. Las estructuras son simples contenedores de datos, mientras que las clases se usan para objetos que necesitan actuar sobre los datos además de mantenerlos.




Son casi lo mismo. Gracias a la magia de C ++, una estructura puede contener funciones, usar herencia, creada usando "nuevo" y así como una clase

La única diferencia funcional es que una clase comienza con derechos de acceso privados, mientras que una estructura comienza con público. Esta es la compatibilidad hacia atrás con C.

En la práctica, siempre he usado estructuras como portadores de datos y clases como objetos.




son lo mismo con diferentes valores predeterminados (privado por defecto para la class y público por defecto para la struct ), por lo que en teoría son totalmente intercambiables.

Entonces, si solo quiero empaquetar alguna información para moverme, uso una estructura, incluso si pongo algunos métodos allí (pero no muchos). Si es una cosa en su mayoría opaca, donde el uso principal sería a través de métodos, y no directamente a los miembros de datos, uso una clase completa.




Técnicamente, ambos son iguales en C ++; por ejemplo, es posible que una estructura tenga operadores sobrecargados, etc.

Sin embargo :

Utilizo structs cuando deseo pasar información de varios tipos simultáneamente. Utilizo clases cuando trato con un objeto "funcional".

Espero eso ayude.

#include <string>
#include <map>
using namespace std;

struct student
{
    int age;
    string name;
    map<string, int> grades
};

class ClassRoom
{
    typedef map<string, student> student_map;
  public :
    student getStudentByName(string name) const 
    { student_map::const_iterator m_it = students.find(name); return m_it->second; }
  private :
    student_map students;
};

Por ejemplo, estoy devolviendo a un estudiante de struct en los métodos get ... () aquí - disfrútalo.




Utilizo estructuras cuando necesito crear un tipo de POD o functor.




Todos los miembros de la clase son privados por defecto y todos los miembros de la estructura son públicos por defecto. La clase tiene bases privadas predeterminadas y Struct tiene bases públicas predeterminadas. Struct en el caso de C no puede tener funciones miembro, mientras que en el caso de C ++ podemos agregar funciones miembro a la estructura. Aparte de estas diferencias, no encuentro nada sorprendente en ellas.




Recomiendo no mezclar struct y class .

Como han señalado otros

  • Ambos son equivalentes aparte de la visibilidad por defecto.
  • puede haber razones para ser forzado a usar una o la otra por cualquier razón

A menos que sea forzado, vaya solo con struct o solo con class porque le protege de problemas de enlace críptico sin costo .

Si reenvías declara algo. como la class X; y luego struct X { ... } como struct X { ... } puede funcionar en algunos enlazadores (por ejemplo, g ++) y puede fallar en otros (por ejemplo, MSVC), por lo que se encontrará en el infierno de los desarrolladores. Como no hay razón para mezclar struct y class , ¿por qué uno debería hacer que los pensamientos sean más complicados y preocuparse por si esa cosa era una class o struct ?




Nunca uso "struct" en C ++.

Nunca puedo imaginar un escenario en el que usarías una estructura cuando quieres miembros privados, a menos que intentes ser confuso.

Parece que el uso de estructuras es más una indicación sintáctica de cómo se utilizarán los datos, pero prefiero hacer una clase y tratar de hacerlo explícito en el nombre de la clase, o por medio de comentarios.

P.ej

class PublicInputData {
    //data members
 };



Related