¿Cuáles son las diferencias entre struct y clase en C ++?

Esta pregunta ya fue hecha en el contexto de C # /. Net .

Ahora me gustaría aprender las diferencias entre una estructura y una clase en C ++. Por favor, discuta las diferencias técnicas, así como las razones para elegir uno u otro en el diseño OO.

Comenzaré con una diferencia obvia:

  • Si no especifica public: o private: miembros de una estructura son públicos por defecto; los miembros de una clase son privados por defecto.

Estoy seguro de que hay otras diferencias que se encuentran en las esquinas oscuras de la especificación C ++.

Olvidas la difícil segunda diferencia entre clases y estructuras.

Sobre el estándar (§11.2.2 en C ++ 98 a C ++ 11):

En ausencia de un especificador de acceso para una clase base, se asume public cuando la clase derivada se declara como struct y se asume private cuando la clase se declara como clase .

Y solo por completitud, la diferencia más conocida entre clase y estructura se define en (11.2):

Los miembros de una clase definida con la clase de palabra clave son privados por defecto. Los miembros de una clase definida con las palabras clave struct o union son públicas por defecto.

Diferencia adicional: la class palabra clave se puede usar para declarar parámetros de plantilla, mientras que la palabra clave struct no se puede usar de ese modo.

Citando las preguntas frecuentes de C ++ ,

[7.8] ¿Cuál es la diferencia entre las palabras clave struct y clase?

Los miembros y las clases base de una estructura son públicos de forma predeterminada, mientras que en clase, tienen el valor predeterminado en privado. Nota: debe hacer que sus clases base sean explícitamente públicas, privadas o protegidas, en lugar de confiar en los valores predeterminados.

La estructura y la clase son funcionalmente equivalentes.

OK, suficiente de esa charla techno limpia y chillona. 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 stack abierta de bits con muy poco encapsulamiento 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 datos públicos (¡tales cosas existen en sistemas bien diseñados!), Pero de lo contrario probablemente debería usar la clase palabra clave.

Vale la pena recordar los orígenes de C ++ y la compatibilidad con C.

C tiene estructuras, no tiene ningún concepto de encapsulación, por lo que todo es público.

Ser público por defecto generalmente se considera una mala idea cuando se toma un enfoque orientado a objetos, por lo que al hacer una forma de C que sea nativamente propicia para OOP (puede hacer OO en C, pero no lo ayudará) que fue el idea en C ++ (originalmente “C With Classes”), tiene sentido hacer que los miembros sean privados por defecto.

Por otro lado, si Stroustrup hubiera cambiado la semántica de struct para que sus miembros fueran privados por defecto, habría roto la compatibilidad (ya no es tan cierto a medida que los estándares divergieron, pero todos los progtwigs C válidos también eran progtwigs válidos de C ++ , lo que tuvo un gran efecto al darle un punto de apoyo a C ++).

Entonces, una nueva palabra clave, class fue introducida para ser exactamente como una estructura, pero privada por defecto.

Si C ++ hubiera llegado desde cero, sin historial, entonces probablemente solo tendría una palabra clave. Probablemente tampoco habría tenido el impacto que hizo.

En general, las personas tenderán a usar struct cuando están haciendo algo así como cómo se usan las estructuras en C; miembros públicos, sin constructor (siempre que no esté en una unión, puede tener constructores en estructuras, al igual que con las clases, pero las personas no lo hacen), sin métodos virtuales, etc. Dado que los idiomas son tanto para comunicarse con las personas que leen el código para instruir a las máquinas (o si no, nos quedamos con los códigos de operación de ensamblado y VM sin procesar) es una buena idea seguir con eso.

Los miembros de la clase son privados por defecto. Los miembros de Struct son públicos por defecto. Además de eso, no hay otras diferencias. También vea esta pregunta .

De acuerdo con Stroustrup en el lenguaje de progtwigción C ++ :

El estilo que uses depende de las circunstancias y el gusto. Por lo general, prefiero usar struct para las clases que tienen todos los datos públicos. Pienso en clases como “tipos no del todo adecuados, solo estructuras de datos”.

Funcionalmente, no hay diferencia más que la pública / privada

STRUCT es un tipo de tipo de datos abstracto que divide un trozo dado de memoria de acuerdo con la especificación de la estructura. Las estructuras son particularmente útiles en la serialización / deserialización de archivos ya que la estructura a menudo se puede escribir en el archivo textualmente. (es decir, obtenga un puntero a la estructura, use la macro TAMAÑO para calcular el número de bytes para copiar, luego mueva los datos dentro o fuera de la estructura).

Las clases son un tipo diferente de tipo de datos abstractos que intentan garantizar el ocultamiento de la información. Internamente, puede haber una variedad de maquinaciones, métodos, variables de temperatura, variables de estado. etc. que se usan para presentar una API consistente a cualquier código que desee usar la clase.

En efecto, las estructuras son sobre datos, las clases son sobre códigos.

Sin embargo, necesitas entender que estas son simplemente abstracciones. Es perfectamente posible crear estructuras que se parecen mucho a clases y clases que se parecen mucho a las estructuras. De hecho, los primeros comstackdores de C ++ no eran más que precomstackdores que traducen el código de C ++ a C. Por lo tanto, estas abstracciones son un beneficio para el pensamiento lógico, no necesariamente un activo para la computadora misma.

Más allá del hecho de que cada uno es un tipo diferente de abstracción, las clases proporcionan soluciones al acertijo de nombres de códigos C. Como no puede haber más de una función expuesta con el mismo nombre, los desarrolladores solían seguir un patrón de _ (). por ejemplo, mathlibextreme_max (). Al agrupar las API en clases, funciones similares (aquí las llamamos “métodos”) pueden agruparse y protegerse de la denominación de métodos en otras clases. Esto permite al progtwigdor organizar mejor su código y boost la reutilización del código. En teoría, al menos.

La única otra diferencia es la herencia predeterminada de clases y estructuras, que, como era de esperar, es privada y pública, respectivamente.

1) Los miembros de una clase son privados por defecto y los miembros de struct son públicos por defecto.

Por ejemplo, el progtwig 1 falla en la comstackción y el progtwig 2 funciona bien.

 // Program 1 #include  class Test { int x; // x is private }; int main() { Test t; tx = 20; // compiler error because x is private getchar(); return 0; } Run on IDE // Program 2 #include  struct Test { int x; // x is public }; int main() { Test t; tx = 20; // works fine because x is public getchar(); return 0; } 

2) Al derivar una estructura de una clase / estructura, el especificador de acceso predeterminado para una clase base / estructura es público. Y al derivar una clase, el especificador de acceso predeterminado es privado.

Por ejemplo, el progtwig 3 falla en la comstackción y el progtwig 4 funciona bien.

 // Program 3 #include  class Base { public: int x; }; class Derived : Base { }; // is equilalent to class Derived : private Base {} int main() { Derived d; dx = 20; // compiler error becuase inheritance is private getchar(); return 0; } Run on IDE // Program 4 #include  class Base { public: int x; }; struct Derived : Base { }; // is equilalent to struct Derived : public Base {} int main() { Derived d; dx = 20; // works fine becuase inheritance is public getchar(); return 0; } 

No en la especificación, no. La diferencia principal está en las expectativas del progtwigdor cuando leen su código en 2 años. a menudo se supone que las estructuras son POD. Las estructuras también se utilizan en la metaprogtwigción de plantillas cuando se define un tipo para fines distintos de la definición de objetos.

Otra cosa a tener en cuenta es que si actualizaste una aplicación heredada que tenía estructuras para usar clases, es posible que te topes con el siguiente problema:

El código antiguo tiene structs, el código se limpió y estos cambiaron a clases. Una o dos funciones virtuales se agregaron a la nueva clase actualizada.

Cuando las funciones virtuales están en clases, internamente el comstackdor agregará un puntero extra a los datos de la clase para señalar las funciones.

Cómo esto rompería el viejo código heredado si en el código anterior en alguna parte la estructura se borrara utilizando memfill para borrar todo a ceros, esto también pisaría los datos del puntero extra.

  1. Los miembros de una estructura son públicos por defecto, los miembros de la clase son privados por defecto.
  2. La herencia predeterminada para la Estructura de otra estructura o clase es pública. La herencia predeterminada para la clase de otra estructura o clase es privada.
 class A{ public: int i; }; class A2:A{ }; struct A3:A{ }; struct abc{ int i; }; struct abc2:abc{ }; class abc3:abc{ }; int _tmain(int argc, _TCHAR* argv[]) { abc2 objabc; objabc.i = 10; A3 ob; ob.i = 10; //A2 obja; //privately inherited //obja.i = 10; //abc3 obss; //obss.i = 10; } 

Esto está en VS2005.

Otra diferencia principal es cuando se trata de plantillas. Por lo que sé, puedes usar una clase cuando defines una plantilla pero NO una estructura.

 template // OK template // ERROR, struct not allowed here 
  • . En las clases, todos los miembros de forma predeterminada son privados, pero los miembros de la estructura son públicos por defecto.

    1. No existe un término como constructor y destructor para las estructuras, pero para la clase el comstackdor crea el valor predeterminado si no lo proporciona.

    2. El tamaño de la estructura vacía es de 0 Bytes wer, ya que Sizeof empty class es 1 Byte. El tipo de acceso predeterminado de struct es public. Una estructura debería usarse típicamente para agrupar datos.

    El tipo de acceso predeterminado de clase es privado, y el modo predeterminado para la herencia es privado. Se debe usar una clase para agrupar datos y métodos que operan con esos datos.

    En resumen, la convención es usar struct cuando el propósito es agrupar datos, y usar clases cuando necesitamos abstracción de datos y, tal vez, herencia.

    En C ++ las estructuras y las clases se pasan por valor, a menos que se eliminen referencias explícitas. En otros idiomas, las clases y estructuras pueden tener una semántica distinta, es decir. los objetos (instancias de clases) se pueden pasar por referencia y las estructuras se pueden pasar por valor. Nota: hay comentarios asociados con esta pregunta. Vea la página de discusión para agregar a la conversación.

Aquí hay una buena explicación: http://carcino.gen.nz/tech/cpp/struct_vs_class.php

Entonces, una vez más: en C ++, una estructura es idéntica a una clase, excepto que los miembros de una estructura tienen visibilidad pública por defecto, pero los miembros de una clase tienen visibilidad privada por defecto.

Es solo una convención. Las estructuras se pueden crear para contener datos simples, pero luego se puede evolucionar el tiempo con la adición de funciones miembro y constructores. Por otro lado, es raro ver algo que no sea público: acceso en una estructura.

ISO IEC 14882-2003

9 clases

§3

Una estructura es una clase definida con la struct clave de clase ; sus miembros y clases base (cláusula 10) son públicos por defecto (cláusula 11).

Las otras respuestas han mencionado los valores predeterminados privados / públicos, (pero tenga en cuenta que una estructura es una clase es una estructura, no son dos elementos diferentes, solo dos formas de definir el mismo elemento).

Lo que podría ser interesante observar (particularmente porque el asker probablemente use MSVC ++ ya que menciona C ++ “no administrado”) es que Visual C ++ se queja bajo ciertas circunstancias si una clase se declara con class y luego se define con struct (o posiblemente la otra) forma redonda), aunque el estándar dice que es perfectamente legal.

Aunque implícito en otras respuestas, no se menciona explícitamente, las estructuras son compatibles con C, dependiendo del uso; las clases no son

Esto significa que si está escribiendo un encabezado que quiere que sea compatible con C, entonces no tiene otra opción que no sea struct (que en el mundo C no puede tener funciones, pero puede tener punteros de función).

La diferencia entre las palabras clave struct y class en C ++ es que cuando no hay un especificador específico en un tipo de datos compuesto determinado, por defecto struct o union son las palabras clave públicas que simplemente consideran la ocultación de datos pero class es la palabra clave privada que considera el ocultamiento del progtwig códigos o datos Siempre algunos progtwigdores usan struct para datos y clases por código sake. Para obtener más información, comuníquese con otras fonts.

De todos estos factores, se puede concluir que el concepto Clase es muy adecuado para representar objetos del mundo real en lugar de “Estructuras”. Principalmente porque los conceptos OOP utilizados en clase son muy prácticos para explicar escenarios del mundo real, por lo tanto, es más fácil fusionarlos a la realidad. Por ejemplo, la herencia predeterminada es pública para las estructuras, pero si aplicamos esta regla para el mundo real, es ridículo. Pero en una clase, la herencia predeterminada es privada, lo cual es más realista.

De todos modos, lo que necesito justificar es que Class es un concepto mucho más amplio y aplicable en el mundo real, mientras que Structure es un concepto primitivo con una organización interna pobre (aunque la estructura sigue los conceptos de OOP, tienen un significado pobre)

La clase solo tiene sentido en el contexto de la ingeniería de software. En el contexto de las estructuras de datos y los algoritmos, la clase y la estructura no son tan diferentes. No hay ninguna regla restringida que el miembro de la clase debe ser referenciado.

Al desarrollar proyectos grandes con toneladas de personas sin clase, finalmente puede obtener un código acoplado complicado porque todos usan las funciones y los datos que desean. la clase proporciona controles de permiso e inherentes para mejorar el desacoplamiento y la reutilización de códigos.

Si lee algunos principios de ingeniería de software, encontrará que la mayoría de los estándares no se pueden implementar fácilmente sin clase. por ejemplo: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

Por cierto, cuando una estructura asigna un crujido de memoria e incluye varias variables, las variables de tipo de valor indican que los valores están incrustados en donde se asigna struct. En contraste, los valores de la variable de tipo de referencia son externos y referenciados por un puntero que también está incrustado en donde se asigna struct.

Puede considerar esto para obtener instrucciones sobre cuándo ir a struct o class, https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx .

√ CONSIDER definir una estructura en lugar de una clase si las instancias del tipo son pequeñas y, por lo general, de corta duración o están comúnmente integradas en otros objetos.

X EVITA definir una estructura a menos que el tipo tenga todas las características siguientes:

Lógicamente representa un único valor, similar a los tipos primitivos (int, double, etc.).

Tiene un tamaño de instancia de menos de 16 bytes.

Es inmutable

No será necesario encasillarlo frecuentemente.

Encontré otra diferencia. si no define un constructor en una clase, el comstackdor definirá uno. pero en una estructura si no define un constructor, el comstackdor tampoco define un constructor. entonces, en algunos casos, realmente no necesitamos un constructor, struct es una mejor opción (punta de rendimiento). y perdón por mi mal inglés

La principal diferencia entre la estructura y la palabra clave de clase en ups es que ninguna statement de miembro público y privado está presente en la estructura y el miembro de datos y la función de miembro se pueden definir como públicos, privados y protegidos.

Estoy viendo otro diferente entre las estructuras y las clases que tienen que ver con la inicialización predeterminada.

 struct Foo { int a; }; class Bar { int a; }; class Tester { Foo m_Foo = Foo(); Bar m_Bar = Bar(); public: Tester() {} }; int main() { auto myTester = Tester(); } 

Ejecute ese código y examine myTester. Encontrarás que para m_Foo, la estructura, m_Foo.a se ha inicializado a 0, pero para m_Bar, la clase, m_Bar.a no está inicializada. Entonces parece que hay una diferencia en lo que hace el constructor predeterminado para struct vs. class. Estoy viendo esto con Visual Studio.

La principal diferencia entre struct y class es que en struct solo puedes declarar variables de datos de diferentes tipos de datos, mientras que en clase puedes declarar variables de datos, funciones de miembros y así puedes manipular variables de datos a través de funciones.

-> Otra cosa útil que encuentro en la clase vs struct es que al implementar archivos en un progtwig si quieres realizar algunas operaciones de una estructura una y otra vez en cada nuevo conjunto de operaciones, necesitas hacer una función separada y necesitas Pase el objeto de struct después de leerlo del archivo para realizar algunas operaciones en él. mientras está en clase si realiza una función que realiza algunas operaciones sobre los datos necesarios cada vez … es fácil, solo tiene que leer el objeto del archivo y llamar a la función …

Pero depende del progtwigdor qué camino encuentre adecuado … según yo prefiero la clase siempre porque soporta OOPs y esa es la razón por la que se implementa en casi todos los idiomas y es la característica maravillosa de la progtwigción de todos los tiempos; )

Y sí, la diferencia más inolvidable que olvidé mencionar es que la clase admite el ocultamiento de datos y también admite operaciones que se realizan en tipos de datos integrados, ¡mientras que struct doesnt!

Las clases son tipos de referencia y las estructuras son tipos de valores.
Cuando digo que las clases son tipos de referencia,
básicamente contendrán la dirección de una variable de instancia.

Por ejemplo:

 Class MyClass { Public Int DataMember; //By default, accessibility of class data members //will be private. So I am making it as Public which //can be accessed outside of the class. } 

En el método principal,
Puedo crear una instancia de esta clase usando un nuevo operador que asigna memoria para esta clase
y almacena la dirección base de eso en la variable de tipo MyClass (_myClassObject2).

 Static Public void Main (string[] arg) { MyClass _myClassObject1 = new MyClass(); _myClassObject1.DataMember = 10; MyClass _myClassObject2 = _myClassObject1; _myClassObject2.DataMember=20; } 

En el progtwig anterior, MyClass _myClassObject2 = _myClassObject1; instrucción indica que ambas variables de tipo MyClass

  1. myClassObject1
  2. myClassObject2

y apuntará a la misma ubicación de memoria.
Básicamente asigna la misma ubicación de memoria a otra variable del mismo tipo.

Entonces, si cualquier cambio que hagamos en cualquiera de los objetos, escriba MyClass tendrá un efecto en otro
ya que ambos apuntan a la misma ubicación de memoria.

“_myClassObject1.DataMember = 10;” en esta línea, los miembros de datos del objeto contendrán el valor de 10.
“_myClassObject2.DataMember = 20;” en esta línea, tanto el miembro de datos del objeto contendrá el valor de 20.
Eventualmente, estamos accediendo a los datos de un objeto a través de punteros.

A diferencia de las clases, las estructuras son tipos de valores. Por ejemplo:

 Structure MyStructure { Public Int DataMember; //By default, accessibility of Structure data //members will be private. So I am making it as //Public which can be accessed out side of the structure. } Static Public void Main (string[] arg) { MyStructure _myStructObject1 = new MyStructure(); _myStructObject1.DataMember = 10; MyStructure _myStructObject2 = _myStructObject1; _myStructObject2.DataMember = 20; } 

En el progtwig anterior,
instanciando el objeto de tipo MyStructure usando el nuevo operador y
almacenar la dirección en la variable _myStructObject del tipo MyStructure y
asignando el valor 10 al miembro de datos de la estructura usando “_myStructObject1.DataMember = 10”.

En la siguiente línea,
Estoy declarando otra variable _myStructObject2 de tipo MyStructure y asignando _myStructObject1 a eso.
Aquí el comstackdor .NET C # crea otra copia del objeto _myStructureObject1 y
asigna esa ubicación de memoria a la variable MyStructure _myStructObject2.

Entonces, cualquier cambio que hagamos en _myStructObject1 nunca tendrá un efecto en otra variable _myStructObject2 de tipo MyStructrue.
Es por eso que estamos diciendo que las estructuras son tipos de valores.

Entonces la clase Base inmediata para la clase es Objeto y la clase Base inmediata para Estructura es ValueType que hereda de Object.
Las clases admitirán una Herencia mientras que las Estructuras no lo harán.

¿Cómo estamos diciendo eso?
¿Y cuál es la razón detrás de eso?
La respuesta es Clases.

Puede ser abstracto, sellado, estático y parcial y no puede ser interno, protegido ni protegido.

There are 3 basic difference between structure and class

1St- memory are reserved for structure in stack memory (which is near to programming language )whether for class in stack memory are reserved for only reffrence and actual memory are reserved in heap memory.

2Nd – By default structure treat as a public whether class treat as a private .

3Rd- can’t re -use code in structure but in class we can re-use same code in many time called inhertence