Clase versus estructura

12

En C ++ y otros lenguajes influenciados hay una construcción llamada Estructura ( struct), y otra llamada class. Ambos son capaces de mantener funciones y variables. Algunas diferencias son:

  1. A la clase se le da memoria en el montón y structse le da memoria en la pila (observación: esto es incorrecto para C ++, pero tal vez sea correcto en lo que el OP llamó "lenguajes influenciados")
  2. Las variables de clase son privadas por defecto y en structellas son públicas

Mi pregunta es: ¿fue structabandonado de alguna manera por la clase? Si es así, ¿por qué? Aparte de las diferencias anteriores, a structpuede hacer las mismas cosas que hace una clase. Entonces, ¿por qué abandonarlo?

prometheuspk
fuente
por abandono quise decir por qué uno se usa sobre el otro.
prometheuspk
su pregunta responde esto en sí, creo.
Umair A.
3
La diferencia entre clases y estructuras depende del idioma. Algunas lecciones de C ++ no se aplican realmente a C #.
Trabajo
66
Uhhhh En C ++ puede asignar objetos en la pila o el montón. Donde quieras.
jojo
8
Mal, mal, mal. Stack vs. Heap no tiene nada que ver con la diferencia.
Aaronaught

Respuestas:

11

No se abandona en absoluto. De hecho, incluso los lenguajes modernos como C # que hacen un uso intensivo de classtodavía te ofrecen struct. En cuanto a cuándo es útil elegir uno sobre el otro, lo remito a este artículo:

Elegir entre clases y estructuras

Citado del artículo de MSDN:

Considere definir una estructura en lugar de una clase si las instancias del tipo son pequeñas y comúnmente de corta duración o están incrustadas comúnmente en otros objetos.

No defina una estructura a menos que el tipo tenga todas las características siguientes:

  • Lógicamente representa un valor único, similar a los tipos primitivos (entero, doble, etc.).
  • Tiene un tamaño de instancia menor de 16 bytes.
  • Es inmutable.
  • No tendrá que estar en caja con frecuencia.
blubb
fuente
44
Esta respuesta es realmente errónea, ya que el significado de .Net / C # struct / class es diferente al de C ++: ¡usan el mismo nombre pero tienen una semántica diferente según el idioma! En C ++ casi no hay diferencia entre struct y class y la pregunta es totalmente errónea en el primer punto, que es correcto en c # y D pero no en c ++. Entonces, el enlace a este artículo, que trata sobre .Net, está realmente muy mal. ¡No es C ++!
Klaim
@Klaim técnicamente tampoco es adecuado para C # (las estructuras pueden estar en el montón) La distinción importante en C # es entre semántica de valor y semántica de referencia, una distinción que C ++ no necesita, ya que puede tener valores o referencias para cualquier cosa
jk.
17

Está equivocado acerca de C ++: la única diferencia significativa entre clase y estructura es la diferencia del especificador de acceso predeterminado. Struct y class son sinónimos para todos los propósitos, creo que struct se mantiene para compatibilidad con C.

Joris Timmermans
fuente
77
No solo. Struct es una buena opción cuando solo quieres volcar un montón de datos en un objeto y no agregarle ningún comportamiento.
quant_dev
2
@quant: Esa es una razón terrible para usar una estructura. Realmente espero que ese comentario sea irónico.
Aaronaught
1
@Aaronaught ¿Por qué? Mi opinión sobre el uso de struct es bastante estándar, vea esta respuesta, por ejemplo: stackoverflow.com/questions/54585/…
quant_dev
1
@Aaronaught ¿Cómo devuelve múltiples valores entonces? Digamos que un modelo progresivo devuelve el precio limpio, el precio sucio y la suma de los pagos acumulados.
quant_dev
1
@quant_dev: puede decidir adjuntar algún meta-significado a una estructura para sus propósitos (y para los antiguos programadores de C, uno que realmente tiene mucho sentido), pero eso no cambia el hecho de que la única diferencia entre la estructura y Las palabras clave de clase en C ++ son el acceso predeterminado.
Joris Timmermans
2

el lenguaje D ha creado una mayor distinción entre clase y estructura

una estructura en d no es más que un registro de datos asignado por pila con algunas funciones a las que puede recurrir (no hay opción de herencia a menos que use una configuración enum + union, es decir, implemente el polimorfismo usted mismo) que se pasa por valor

una clase es como estamos acostumbrados: funciones virtuales, asignación de montón, herencia (única), aprobada por ref

monstruo de trinquete
fuente