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

951

¿En qué escenarios es mejor usar un structvs a classen C ++?

Alan Hinchcliffe
fuente
48
Esto no solo es aplicable a C ++, sino a cualquier lenguaje que proporcione tanto estructuras como clases.
Jason Bunting
3
Todavía estoy en desacuerdo: abordo esta pregunta semánticamente. Tal vez hay algunas diferencias técnicas, pero semánticamente, no lo son. Las estructuras son realmente útiles para crear tipos de valor, las clases no lo son.
Jason Bunting
44
Creo que no hay una razón seria para usar estructuras en C ++. Para mí, las estructuras son otra "característica" redundante de C ++ que existe solo por compatibilidad con C, como typedefs. Esto no existiría si C ++ no se tratara inicialmente como una extensión de C y se diseñara desde cero, como Java. En general, encuentro que muchas de las cosas más extrañas sobre C ++ tienen que ver con la compatibilidad de C.
Kostas
55
Estructura: para POD (datos antiguos simples) y la accesibilidad de todos los miembros es pública. Clase: cuando necesita una mejor encapsulación y necesita funciones miembro para trabajar con el estado de la clase.
Navaneeth KN
44
Esto es cierto solo por convención. No hay diferencia, aparte de la encapsulación predeterminada.
Dave Hillier

Respuestas:

806

Las diferencias entre a classy a structen C ++ son que las estructuras tienen publicmiembros y bases predeterminados y las clases tienen privatemiembros y bases predeterminados . Ambas clases y las estructuras pueden tener una mezcla de public, protectedyprivate los miembros, pueden utilizar la herencia y pueden tener funciones miembro.

Recomendaría usar estructuras como estructuras de datos antiguos sin ninguna clase de características, y usar clases como estructuras de datos agregados con privatedatos y funciones miembro.

El comodoro Jaeger
fuente
100
Una estructura sin modificadores o métodos se llama estructura POD, que existe como una interfaz compatible con versiones anteriores de las bibliotecas C, ya que (supuestamente) se garantiza que se presentará como si fuera una estructura C. Sin embargo, aparte de esta única excepción, la única diferencia es la establecida.
workmad3
26
@ workmad3: el nombre es engañoso, pero 9/4 (C ++ 03) dice: "Un POD-struct es una clase agregada que no tiene miembros de datos no estáticos de tipo non-POD-struct, non-POD-union (o matriz de tales tipos) o referencia, y no tiene operador de asignación de copia definido por el usuario ni destructor definido por el usuario ". No hay restricciones para usar la clave de clase "struct" y no hay restricciones para usar "public" (vea 8.5.1 / 1 para los requisitos agregados). Esto no es una diferencia entre "struct" y "class".
55
Su uso de "agregado" podría ser mal entendido, dada la definición del estándar. :)
3
De acuerdo con el libro "Principios y práctica" de Stroustrup: "las estructuras deben usarse principalmente donde los miembros pueden tomar cualquier valor" (es decir, donde no se puede definir una invariante de clase significativa)
antibus
66
Por supuesto, puede usar clases al interactuar con C. No hay diferencia entre clases y estructuras. Las estructuras son clases; solo el acceso predeterminado se cambia de privado a público.
Sebastian Mach
230

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

  • structvalores predeterminados de acceso público y classvalores predeterminados de acceso privado.
  • Al heredar, el valor structpredeterminado es publicherencia y el valor classpredeterminado es privateherencia. (Irónicamente, como con tantas cosas en C ++, el valor predeterminado es al revés: la publicherencia es, con mucho, la opción más común, pero la gente rara vez declara structs solo para ahorrar al escribir la publicpalabra clave " ".

Pero la verdadera diferencia en la práctica es entre un class/ structque declara un constructor / destructor y uno que no. 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 esta distinción clara, muchas personas deliberadamente solo usan structs para los tipos de POD y, si van a agregar algún método, usan classes. 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 POD": ¿Qué son los tipos POD en C ++? )

cuarc
fuente
Buen ejemplo con respecto a las diferencias de herencia: aquí .
Liran Orevi
8
Si usa structo classno tiene relación con si su objeto es POD o si debe definir un constructor / destructor de copia. Las funciones de los miembros tampoco tienen relación con que algo sea POD. Cuando vuelvo a leer lo que escribiste, veo que no estás sugiriendo lo contrario, pero la redacción actual es confusa
David Stone el
1
@DavidStone Básicamente, se supone que las estructuras de POD deben ser compatibles con el código C y, por lo tanto, se supone que solo están diseñadas como estructuras de estilo C.
Justin Time - Restablece a Monica
3
La parte de "diferencia real" de esta respuesta es totalmente errónea.
juanchopanza
178

Hay muchas ideas falsas en las respuestas existentes.

Ambos classy structdeclarar una clase.

Sí, es posible que deba reorganizar sus palabras clave de modificación de acceso dentro de la definición de clase, según la palabra clave que utilizó para declarar la clase.

Pero, más allá de la sintaxis, la única razón para elegir una sobre la otra es la convención / estilo / preferencia.

A algunas personas les gusta seguir con la structpalabra clave para clases sin funciones de miembro, porque la definición resultante "parece" una estructura simple de C.

Del mismo modo, a algunas personas les gusta usar la classpalabra clave para las clases con funciones y privatedatos de miembros , porque dice "clase" y, por lo tanto, parece ejemplos de su libro favorito sobre programación orientada a objetos.

La realidad es que esto depende completamente de usted y su equipo, y literalmente no hará ninguna diferencia en su programa.

Las siguientes dos clases son absolutamente equivalentes en todos los sentidos, excepto su nombre:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

Incluso puede cambiar las palabras clave al volver a declarar:

class Foo;
struct Bar;

(aunque esto rompe las compilaciones de Visual Studio debido a la no conformidad, por lo que el compilador emitirá una advertencia cuando haga esto).

y las siguientes expresiones se evalúan como verdaderas:

std::is_class<Foo>::value
std::is_class<Bar>::value

Sin embargo, tenga en cuenta que no puede cambiar las palabras clave al redefinir ; esto es solo porque (según la regla de una definición) las definiciones de clase duplicadas en las unidades de traducción deben "consistir en la misma secuencia de tokens" . Esto significa que incluso no pueden intercambiar const int member;con int const member;, y no tiene nada que ver con la semántica de classo struct.

Carreras de ligereza en órbita
fuente
16
Esto fue muy informativo y, sinceramente, mi respuesta favorita. Todos los demás los tratan como entidades separadas, cuando están debajo del capó, son lo mismo. Me pregunto si una definición de estructura en el entorno Arduino se considera una clase cpp, ya que está compilada usando g ++.
Benjamin
44
@Ben Por supuesto que lo es. El compilador Arduino compila C ++; Ese es el final.
underscore_d
77
Entonces, si estoy entendiendo esto bien: siempre que sus modificadores de visibilidad sean explícitos, no se omitan, no importa. Podrías escribir una gran aplicación C ++ usando nada más que estructuras; o podría pasar y cambiar cada caso de estructura a clase. Mientras no esté utilizando la visibilidad predeterminada, las aplicaciones serían exactamente las mismas.
Ryan Lundy
No estoy convencido de que una unidad de traducción de un programa de C ++ pueda tener la declaración completa class foo { public: ... };y otra pueda tener struct foo { ... };que ser cierta según la afirmación "absolutamente equivalente". Se trata de razonar que las declaraciones incompletas struct foo;y class foo;son intercambiables. Estos no especifican el cuerpo de la clase, por lo que no le dicen nada al diseño de acceso.
Kaz
@Kaz: Tienes razón: si las definiciones eran literalmente del mismo tipo, deben ser léxicamente idénticas para que el comportamiento esté bien definido. La clave struct y -clave de clase son de otra manera lógicamente aunque intercambiable (donde la semántica no se ven afectados), y Fooy Barson todavía equivalente / tipos idénticos. Me aseguré de decir "al redeclar " y dar un ejemplo. Ahora que lo pienso, aclararé esto en la respuesta para asegurarme de que no estoy engañando a la gente a UB
Lightness Races in Orbit
54

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

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 
Ferruccio
fuente
35
Ahora que es varios años después y C ++ 11 es compatible con todos los compiladores principales, Lambdas hace que esto sea aún más conciso .
36

Desde C ++ FAQ Lite :

Los miembros y las clases base de una estructura son públicos por defecto, mientras que en la clase, por defecto son privados. Nota: debe hacer que sus clases base sean explícitamente públicas, privadas o protegidas, en lugar de depender de los valores predeterminados.

struct y class son funcionalmente equivalentes.

OK, suficiente de esa charla techno chirriante y limpia. Emocionalmente, la mayoría de los desarrolladores hacen una fuerte distinción entre una clase y una estructura. Una estructura simplemente se siente como una pila abierta de bits con muy poca encapsulación o funcionalidad. Una clase se siente como un miembro vivo y responsable de la sociedad con servicios inteligentes, una fuerte barrera de encapsulación y una interfaz bien definida. Dado que esa es la connotación que la mayoría de la gente ya tiene, probablemente debería usar la palabra clave struct si tiene una clase que tiene muy pocos métodos y tiene datos públicos (¡tales cosas existen en sistemas bien diseñados!), Pero de lo contrario, probablemente debería usar la clase palabra clave.

Tal Pressman
fuente
1
No entiendo por qué afirman que estructura y clase son funcionalmente iguales, pero dicen que prefieren el uno sobre el otro en ciertos casos sin ningún razonamiento ..
deetz
3
El motivo es la convención. Al compilador no le importa cuál usa, pero a otro desarrollador que vea su código le resultará más fácil entender lo que quiere decir.
Tal Pressman
3
@deetz: Todo el tercer párrafo es razonamiento.
Carreras de ligereza en órbita
Wow, viniendo de la "vieja escuela" no tenía idea de que una estructura podría tener métodos e incluso herencia. Siempre he usado struct para cuando solo uso datos sin métodos y generalmente es cuando se trata de código API que necesita la estructura. ¿Pueden las estructuras soportar herencia múltiple también?
Paul McCarthy
21

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 la secuencia 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 decodificar el mensaje en una clase generalmente no vale la pena.

mbyrne215
fuente
Lo mismo se puede lograr en C.
Eugene Bujak
11
O simplemente podría implementar operator >>en una clase en lugar de escribir la processMessagefunción, lo que haría que su C ++ se parezca más a C ++ y menos a C.
Nick Bastin
1
Además del hecho de que no es portátil entre diferentes sistemas, esto viola las reglas de alias, por lo que no se garantiza que funcione incluso dentro de una sola arquitectura.
underscore_d
@underscore_d Esto puede funcionar independientemente de la plataforma (pero no del compilador), pero debe usar campos de bits fijos, una __packed__estructura y tener una implementación ifdef compatible con endian (debe cambiar el orden en una máquina donde la endianess es opuesta a la fuente de datos externa está proporcionando). No es bonito, pero solía empacar / desempaquetar registros para periféricos remotos en plataformas integradas de forma portátil.
crasic
1
@jacwah Huh, buen punto. El alias no será un problema aquí porque uno de los punteros es un chartipo, que está exento de alias. Sin embargo, todavía hay un problema, aunque diferente: enviar un char*a un tipo diferente, si realmente no había ningún objeto del último tipo ya inicializado en esa dirección, es UB ya que viola las reglas de por vida. Afaik, incluso si el tipo de destino es trivialmente construible, simplemente tener memoria asignada no es suficiente para que C ++ permita formalmente tratar esa memoria como ese tipo.
underscore_d
19

Puede usar "struct" en C ++ si está escribiendo una biblioteca cuyas partes internas son C ++ pero la API puede ser llamada por código C o C ++. Simplemente haga un encabezado único que contenga estructuras y funciones API globales que exponga a los códigos C y C ++ de la siguiente manera:

// C access Header to a C++ library
#ifdef __cpp
extern "C" {
#endif

// Put your C struct's here
struct foo
{
    ...
};
// NOTE: the typedef is used because C does not automatically generate
// a typedef with the same name as a struct like C++.
typedef struct foo foo;

// Put your C API functions here
void bar(foo *fun);

#ifdef __cpp
}
#endif

Luego puede escribir una barra de función () en un archivo C ++ usando el código C ++ y hacer que se pueda llamar desde C y los dos mundos pueden compartir datos a través de la estructura declarada. Existen otras advertencias, por supuesto, cuando se mezclan C y C ++, pero este es un ejemplo simplificado.

Adisak
fuente
2
La mejor respuesta adecuada. La compatibilidad C es realmente la razón más importante. todas las demás cosas, como el acceso predeterminado, son esotéricas.
Valentin Heinitz
16

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 auxiliares. Por ejemplo, cuando necesito algo como esto:

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

    int length() {return x+y+z;}
};
ogoide
fuente
1
+1 por dar un ejemplo de una estructura con algunas funciones miembro que no parecen haber "quitado la estructura".
einpoklum
9

Para responder a mi propia pregunta (descaradamente), como ya se mencionó, los privilegios de acceso son la única diferencia entre ellos en C ++.

Tiendo a usar una estructura solo para almacenamiento de datos. Le permitiré obtener algunas funciones auxiliares si facilita el trabajo con los datos. Sin embargo, tan pronto como los datos requieran control de flujo (es decir, captadores / establecedores que mantengan o protejan un estado interno) o comience a adquirir cualquier funcionalidad importante (básicamente más similar a un objeto), se 'actualizará' a una clase para comunicar mejor la intención.

Alan Hinchcliffe
fuente
9

Las estructuras ( POD , en general) son útiles cuando se proporciona una interfaz compatible con C con una implementación de C ++, ya que son portátiles a través de las fronteras del lenguaje y los formatos de enlace.

Si eso no le preocupa, entonces supongo que el uso de la "estructura" en lugar de la "clase" es un buen comunicador de intenciones (como dijo anteriormente @ZeroSignal). Las estructuras también tienen una semántica de copia más predecible, por lo que son útiles para los datos que tiene la intención de escribir en medios externos o enviar a través del cable.

Las estructuras también son útiles para diversas tareas de metaprogramación, como las plantillas de rasgos que solo exponen un montón de definiciones de tipos dependientes:

template <typename T> struct type_traits {
  typedef T type;
  typedef T::iterator_type iterator_type;
  ...
};

... Pero eso es solo aprovechar el nivel de protección predeterminado de struct que es público ...

argv0
fuente
1
Ese no es el uso correcto de POD. Una estructura (o clase) puede ser estructura POD si (y solo si) contiene SOLO miembros POD.
Martin York
44
"semántica de copia predecible": la sintaxis es la misma que para la clase (y tiene los mismos problemas (copia superficial)).
Martin York
2
Esta publicación te haría creer (con suerte por accidente) que todas las estructuras son POD. Esto no es del todo cierto. Espero que la gente no se engañe con esto.
Michael Dorst
8

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 de forma predeterminada, mientras que son privados de forma predeterminada en las clases. De lo contrario, en lo que respecta 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 contenedores de datos simples, mientras que las clases se usan para objetos que necesitan actuar sobre los datos además de simplemente retenerlos.

Andy
fuente
4

Son más o menos lo mismo. Gracias a la magia de C ++, una estructura puede contener funciones, usar herencia, crearse usando "nuevo", etc., como una clase

La única diferencia funcional es que una clase comienza con derechos de acceso privado, mientras que una estructura comienza con público. Esta es la compatibilidad con versiones anteriores de C.

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

enigmático
fuente
4

Como otros han señalado

  • ambos son equivalentes, aparte de la visibilidad predeterminada
  • puede haber razones para verse obligado a usar uno u otro por cualquier motivo

Hay una recomendación clara sobre cuándo usar cuál de Stroustrup / Sutter:

Use class si la clase tiene una invariante; use struct si los miembros de datos pueden variar independientemente

Sin embargo, tenga en cuenta que no es aconsejable reenviar declaraciones. como una clase ( class X;) y definirlo como struct ( 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 del desarrollador.

pasbi
fuente
¿Puedes describir estos problemas de enlazador?
Carreras ligeras en órbita
@LightnessRacesinOrbit No puedo, desafortunadamente. Ni siquiera soy capaz de elaborar un ejemplo. El trivial class Foo; struct Foo { void bar() {} }; int main() { Foo().bar(); }no solo compila y se ejecuta con MSVC 2017, incluso produce una advertencia clara que Foofue declarada como structpero definida como class. Pero también recuerdo claramente que le costó a nuestro equipo medio día encontrar ese estúpido error. No estoy seguro de qué versión de MSVC hemos usado en ese entonces.
pasbi
El enlazador ni siquiera debería saber si usó classo structen una declaración de reenvío, y los dos son libremente intercambiables según el estándar (aunque se sabe que VS advierte; siempre supuse que era solo para evitar errores aparentes del programador). Algo no huele bien aquí. ¿Estás seguro de que no fue un error de violación de ODR?
ligereza corre en órbita
1
Hmm, parece VS es no conforme en este sentido (figura GO)
Luminosidad razas en órbita
No me acuerdo exactamente. El problema no ocurrió directamente en una aplicación, sino en una biblioteca que se usó en un gtest. Solo sé que el enlazador produjo errores incomprensibles (LNK ???). Una vez que reemplacé el structavance hacia classadelante, los problemas desaparecieron. A partir de hoy, también me parece extraño. Me alegraría si pudieras arrojar algo de luz sobre ello.
pasbi
3

Clase.

Los miembros de la clase son privados por defecto.

class test_one {
    int main_one();
};

Es equivalente a

class test_one {
  private:
    int main_one();
};

Entonces si lo intentas

int two = one.main_one();

Obtendremos un error: main_one is privateporque no es accesible. Podemos resolverlo inicializándolo especificando que es un público, es decir

class test_one {
  public:
    int main_one();
};

Estructura

Una estructura es una clase donde los miembros son públicos de forma predeterminada.

struct test_one {
    int main_one;
};

Medios main_onees privado es decir

class test_one {
  public:
    int main_one;
};

Utilizo estructuras para estructuras de datos donde los miembros pueden tomar cualquier valor, así es más fácil.

farhan
fuente
3

Una ventaja de structover classes que guarda una línea de código, si se adhiere a "primero miembros públicos, luego privados". En este sentido, encuentro la palabra claveclass inútil.

Aquí hay otra razón para usar solo structy nunca class. Algunas pautas de estilo de código para C ++ sugieren el uso de letras minúsculas para las macros de funciones, la razón es que cuando la macro se convierte en una función en línea, no es necesario cambiar el nombre. Igual que aquí. Tiene su estructura de estilo C agradable y un día, descubre que necesita agregar un constructor, o algún método conveniente. ¿Lo cambias a a class? ¿En todas partes?

Distinguir entre structsy classes es demasiado complicado, interponerse en la forma de hacer lo que deberíamos estar haciendo: programar. Como muchos de los problemas de C ++, surge del fuerte deseo de compatibilidad hacia atrás.

Vorac
fuente
¿Por qué necesitarías cambiarlo a a class? ¿Pensó que una clase definida con la structpalabra clave no puede tener funciones miembro o un constructor?
ligereza corre en órbita
@LightnessRacesinOrbit debido a 1. consistencia y 2. algunos analizadores estáticos se quejan de la violación de 1.
Vorac
Eso no sigue. ¿A qué otras "consistencias" te adhieres? ¿Cada clase con un miembro llamado joe()debe definirse con una classpalabra clave? ¿Cada clase con al menos 4 intmiembros debe definirse con una structpalabra clave?
ligereza corre en órbita
@LightnessRacesinOrbit Me refiero al modismo "Los agregados POD se definen con struct, los agregados con métodos se definen con class". Demasiada molestia.
Vorac
2

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

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

Javier
fuente
2

Las estructuras por defecto tienen acceso público y las clases por defecto tienen acceso privado.

Personalmente, uso estructuras para objetos de transferencia de datos o como objetos de valor. Cuando se usa como tal, declaro que todos los miembros son constantes para evitar modificaciones por otro código.

anio
fuente
2

Tanto structy classson los mismos bajo el capó, aunque con diferentes valores por defecto en cuanto a visibilidad, structpor defecto es público y classpor defecto es privado. Puede cambiar uno para que sea el otro con el uso apropiado de privateypublic . Ambos permiten la herencia, los métodos, los constructores, los destructores y todo lo demás de un lenguaje orientado a objetos.

Sin embargo, una gran diferencia entre los dos es que structuna palabra clave se admite en C, mientras classque no. Esto significa que uno puede usar un structarchivo de inclusión que puede estar #includeen C ++ o C siempre que structsea ​​un estilo C simple structy todo lo demás en el archivo de inclusión sea compatible con C, es decir, sin palabras clave específicas de C ++ como private, por ejemplo ,public , sin métodos, sin herencia, etc. etc. etc.

El estilo AC structse puede usar con otras interfaces que admiten el uso del estilo C structpara transportar datos de un lado a otro a través de la interfaz.

El estilo de CA structes un tipo de plantilla (no una plantilla de C ++ sino un patrón o plantilla) que describe el diseño de un área de memoria. Con los años las interfaces utilizable a partir de C y C con los plug-ins (aquí le está mirando Java y Python y Visual Basic) se han creado algunas de las cuales trabaja con el estilo C struct.

Richard Chambers
fuente
1

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

Sin embargo :

Utilizo estructuras cuando deseo pasar información de múltiples tipos simultáneamente. Uso clases cuando estoy tratando 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 un estudiante de estructura en los métodos get ... () por aquí, disfruta.

Maciek
fuente
1

¿Cuándo elegirías usar struct y cuándo usar class en C ++?

Yo uso structcuando defino functorsy POD. De lo contrario lo uso class.

// '()' is public by default!
struct mycompare : public std::binary_function<int, int, bool>
{
    bool operator()(int first, int second)
    { return first < second; }
};

class mycompare : public std::binary_function<int, int, bool>
{
public:
    bool operator()(int first, int second)
    { return first < second; }
};
AraK
fuente
1
Esta respuesta muestra signos de edad :) std::binary_function<>no solo está en desuso, incluso c ++ 17 la elimina.
sehe
No es una sorpresa realmente ya que fue escrito en la época de C ++ 03, un lenguaje definido hace 15 años.
Carreras ligeras en órbita
1

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

ivan.ukr
fuente
1

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

Frijoles de ayuda
fuente
0

Utilizo struct solo cuando necesito mantener algunos datos sin ninguna función miembro asociada (para operar con los datos miembros) y acceder a las variables de datos directamente.

Por ejemplo: lectura / escritura de datos de archivos y secuencias de socket, etc. Pasar argumentos de función en una estructura donde los argumentos de función son demasiados y la sintaxis de función parece demasiado larga.

Técnicamente no hay una gran diferencia entre clase y estructura, excepto la accesibilidad predeterminada. Más sobre eso depende del estilo de programación como lo use.

harik
fuente
-4

Pensé que Structs tenía la intención de ser una Estructura de datos (como una matriz de información de tipos de datos múltiples) y que las clases estaban destinadas al Empaquetado de código (como colecciones de subrutinas y funciones).

:(

GaiusSensei
fuente
-6

Nunca uso "struct" en C ++.

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

Parece que el uso de estructuras es más una indicación sintáctica de cómo se usarán los datos, pero prefiero simplemente hacer una clase e intentar hacerlo explícito en el nombre de la clase, o mediante comentarios.

P.ej

class PublicInputData {
    //data members
 };
Baltimark
fuente
Según yo, una "indicación sintáctica de cómo se usarán los datos" es una razón perfectamente buena para usar una estructura, especialmente si la alternativa es usar un comentario o un nombre en el nombre de la clase.
Viktor Sehr
2
¿No structsería ya bastante explícito que los miembros de la clase serán, por defecto, públicos?
wrongusername