ventajas una tipo son respecto programacion principales las estructuras estructura entre diferencias diferencia cuáles cual con clases clase c++ oop class struct c++-faq

una - ¿Cuáles son las diferencias entre estructura y clase en C++?



tipo struct y class c++ (28)

Esta pregunta ya se hizo en el contexto de C # / .Net .

Ahora me gustaría aprender las diferencias entre una estructura y una clase en C ++. Discuta las diferencias técnicas así como las razones para elegir una u otra en el diseño OO.

Comenzaré con una diferencia obvia:

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

Estoy seguro de que hay otras diferencias que se encuentran en los rincones oscuros de la especificación de C ++.


ISO IEC 14882-2003

9 clases

§3

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


  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 es en VS2005.


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.


Aunque está 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 ser compatible con C, entonces no tiene otra opción que struct (que en el mundo C no puede tener funciones, pero sí puede tener punteros de función).


Citando las preguntas frecuentes de C ++ ,

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

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

Struct y clase son funcionalmente equivalentes.

OK, basta de esa charla de techno reluciente. 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 forma de encapsulación o funcionalidad. Una clase se siente como un miembro vivo y responsable de la sociedad con servicios inteligentes, una barrera de encapsulación fuerte y una interfaz bien definida. Ya 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.


De todos estos factores, se puede concluir que la clase conceptual es muy adecuada para representar objetos del mundo real en lugar de "Estructuras". En gran medida 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 con la realidad. Por ejemplo, la herencia predeterminada es pública para las estructuras, pero si aplicamos esta regla para el mundo real, es ridícula. Pero en una clase, la herencia predeterminada es privada, lo que es más realista.

De todos modos, lo que necesito para justificar es que la Clase es un concepto mucho más amplio, aplicable al mundo real, mientras que la Estructura es un Concepto primitivo con una organización interna deficiente (aunque la estructura sigue los conceptos de POO, tienen un significado pobre)


Encontré otra diferencia. Si no define un constructor en una clase, el compilador definirá uno. pero en una estructura si no define un constructor, el compilador tampoco define un constructor. por lo tanto, en algunos casos que realmente no necesitamos un constructor, struct es una mejor opción (punta de rendimiento). Y lo siento por mi mal inglés.


Es sólo una convención. Se pueden crear estructuras para almacenar datos simples pero luego evolucionar el tiempo con la adición de funciones miembro y constructores. Por otro lado, es inusual ver algo que no sea público: acceso en una estructura.


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


La clase solo tiene sentido en el contexto de la ingeniería de software. En el contexto de las estructuras de datos y algoritmos, clase y estructura no son tan diferentes. No hay ninguna regla restringida a la que se deba hacer referencia al miembro de la clase.

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

Si lees algunos principios de ingeniería de software, encontrarás 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 integrados en el lugar donde se asigna la estructura. En contraste, los valores de la variable de tipo de referencia son externos y la referencia por un puntero que también está incrustado en donde se asigna la estructura.


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 en particular, struct o union por defecto son las palabras clave públicas que simplemente consideran la ocultación de datos, pero class es la palabra clave privada que considera la ocultación del programa. Códigos o datos. Siempre algunos programadores usan struct para datos y clases por código. Para más información contacte con otras fuentes.


La principal diferencia entre la estructura y la palabra clave de clase en uy es que no hay ninguna declaración de miembro pública y privada presente en la estructura. La función miembro y miembro de datos puede definirse como pública, privada y protegida.


La principal diferencia entre struct y class es que in struct solo puede declarar variables de datos de diferentes tipos de datos, mientras que en class puede declarar variables de datos, funciones miembro y, por lo tanto, puede manipular variables de datos a través de funciones.

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

Pero depende del programador la forma en que lo encuentre adecuado ... de acuerdo con mi preferencia, prefiero la clase cada vez, simplemente porque es compatible con los OOP y esa es la razón por la que se implementa en casi todos los idiomas y es la característica maravillosa de la programación de todos los tiempos; )

Y sí, la diferencia más no olvidada que olvidé mencionar es que la clase admite la ocultación de datos y también las operaciones que se realizan en los tipos de datos integrados, ¡mientras que struct no!


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 programa anterior, MyClass _myClassObject2 = _myClassObject1; La 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 realicemos en cualquiera de los objetos tipo MyClass tendrá un efecto en otro
ya que ambos están apuntando a la misma ubicación de memoria.

"_myClassObject1.DataMember = 10;" en esta línea, ambos 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 miembros de datos de un objeto a través de punteros.

A diferencia de las clases, las estructuras son tipos de valor. 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 programa anterior,
instanciar el objeto de tipo MyStructure utilizando un nuevo operador y
almacenamiento de la dirección en la variable _myStructObject de 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í .NET C # compiler 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.
Por eso decimos que las estructuras son tipos de valor.

Por lo tanto, la clase Base inmediata para la clase es Objeto y la clase Base inmediata para la Estructura es ValueType que se hereda de Objeto.
Las clases soportará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, parcial y no puede ser privado, protegido y protegido interno.


Las otras respuestas mencionan 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 de observar (particularmente dado que es probable que el que pregunta use MSVC ++ ya que menciona C ++ no administrado) es que Visual C ++ se queja en ciertas circunstancias si una clase se declara con class y luego se define con struct (o posiblemente la otra) camino redondo), aunque la norma dice que es perfectamente legal.


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 .


No en la especificación, no. La principal diferencia está en las expectativas del programador cuando leen su código en 2 años. Se suele suponer que las estructuras son POD. Las estructuras también se usan en la metaprogramación de plantillas cuando está definiendo un tipo para fines que no son los objetos.


Otra cosa a tener en cuenta, si actualizó una aplicación heredada que tenía estructuras para usar clases, podría tener el siguiente problema:

El código antiguo tiene estructuras, se limpió el código y se cambiaron a clases. Luego se agregó una función virtual o dos a la nueva clase actualizada.

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

La forma en que esto rompería el antiguo código heredado es que si en el código antiguo en algún lugar se borra la estructura usando memfill para borrarlo todo a ceros, esto también aplastará los datos adicionales del puntero.


Otra diferencia importante es cuando se trata de plantillas. Por lo que sé, puede usar una clase cuando define una plantilla pero NO una estructura.

template<class T> // OK template<struct T> // ERROR, struct not allowed here


Puede considerar esto para las pautas sobre cuándo ir a la estructura o la clase, https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx .

√ CONSIDERE la definición de una estructura en lugar de una clase si las instancias del tipo son pequeñas y, por lo general, duran poco o están comúnmente incrustadas en otros objetos.

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

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

Tiene un tamaño de instancia inferior a 16 bytes.

Es inmutable.

No tendrá que ser boxeado con frecuencia.


STRUCT es un tipo de tipo de datos abstractos que divide una porción de memoria determinada 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 literalmente. (es decir, obtenga un puntero a la estructura, use la macro SIZE para calcular el número de bytes que se copiarán, luego mueva los datos dentro o fuera de la estructura).

Las clases son un tipo diferente de tipo de datos abstractos que intentan garantizar la ocultación de la información. Internamente, puede haber una variedad de maquinaciones, métodos, variables temporales, variables de estado. etc. que se utilizan para presentar una API coherente a cualquier código que desee utilizar la clase.

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

Sin embargo, debe comprender que estas son simplemente abstracciones. Es perfectamente posible crear estructuras que se parecen mucho a clases y clases que se parecen mucho a estructuras. De hecho, los primeros compiladores de C ++ fueron simplemente precompiladores 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 en sí.

Más allá del hecho de que cada uno es un tipo diferente de abstracción, las Clases brindan soluciones al rompecabezas de nomenclatura de código C. Como no puede tener 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, las funciones similares (aquí las llamamos "métodos") se pueden agrupar y proteger de la denominación de métodos en otras clases. Esto permite al programador organizar mejor su código y aumentar la reutilización del código. En teoría, al menos.


Según Stroustrup en el lenguaje de programación C ++ :

El estilo que uses depende de las circunstancias y el gusto. Normalmente prefiero usar struct para las clases que tienen todos los datos públicos. Pienso en tales clases como "tipos no muy adecuados, solo estructuras de datos".

Funcionalmente, no hay otra diferencia que la pública / privada.


Te olvidas de la complicada segunda diferencia entre clases y estructuras.

Califique 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 público cuando la clase derivada se declara struct y se asume privado cuando la clase se declara clase .

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

Los miembros de una clase definida con la palabra clave clase son privados por defecto. Los miembros de una clase definida con la estructura de palabras clave o unión son públicos de forma predeterminada.

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 así.


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

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

Ser público por defecto generalmente se considera una mala idea cuando se adopta un enfoque orientado a objetos, por lo que al hacer una forma de C que sea nativa para la POO (puede hacer OO en C, pero no le ayudará), que fue la En C ++ (originalmente "C con clases"), 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 como los estándares divergidos, pero todos los programas C válidos también eran programas C ++ válidos). , que tuvo un gran efecto en darle a C ++ un punto de apoyo).

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

Si C ++ hubiera venido de cero, sin historial, entonces probablemente tendría solo una de esas palabras clave. También probablemente no habría hecho el impacto que hizo.

En general, las personas tienden a usar struct cuando están haciendo algo como cómo se usan las structs en C; miembros públicos, ningún constructor (siempre que no esté en una unión, puede tener constructores en estructuras, al igual que con las clases, pero la gente tiende a no hacerlo), no hay métodos virtuales, etc. Ya que los idiomas son tanto para comunicarse la gente que lee el código para instruir a las máquinas (o nos apegamos a los códigos de operación VM sin ensamblar y ensamblados) es una buena idea seguir con eso.


Veo otra diferencia 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á 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 la estructura vs clase. Estoy viendo esto con Visual Studio.


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

Por ejemplo, el programa 1 falla en la compilación y el programa 2 funciona bien.

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

2) Cuando se deriva una estructura de una clase / estructura, el especificador de acceso predeterminado para una clase / estructura base es público. Y cuando se deriva una clase, el especificador de acceso predeterminado es privado.

Por ejemplo, el programa 3 falla en la compilación y el programa 4 funciona bien.

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


Hay 3 diferencias básicas entre estructura y clase.

La memoria 1St está reservada para la estructura en la memoria de la pila (que está cerca del lenguaje de programación), ya que para la clase en la memoria de la pila solo se reserva la referencia y la memoria real se reserva en la memoria del montón.

2Nd - Por defecto, la estructura trata como público si la clase trata como privada.

3Rd- no se puede reutilizar el código en la estructura, pero en la clase podemos reutilizar el mismo código en muchas ocasiones, lo que se llama herencia.


  • . En las clases, todos los miembros por defecto son privados, pero en la estructura los miembros son públicos por defecto.

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

    2. El tamaño de la estructura vacía es de 0 bytes, mientras que el tamaño de la clase vacía es de 1 byte. El tipo de acceso predeterminado de la estructura es público. Una estructura normalmente se debe utilizar para agrupar datos.

    El tipo de acceso predeterminado de la clase es privado y el modo predeterminado para la herencia es privado. Se debe utilizar 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 estén explícitamente sin referencia. En otros idiomas, las clases y estructuras pueden tener semánticas distintas, es decir, los objetos (instancias de clases) pueden pasarse por referencia y las estructuras pueden pasarse por valor. Nota: hay comentarios asociados con esta pregunta. Vea la página de discusión para agregar a la conversación.