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

Ahora me gustaría conocer 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 diseño OO.

Voy a empezar con una diferencia obvia:

  • Si no se especifica public: o private:, los 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 los oscuros rincones del C++ especificación.

  • Este enlace resume las diferencias bien.
  • Por qué la gente de todo el uso de la estructura a construir un árbol, entonces? Porque parece que la diferencia no es mucho. BTW, Que es una gran websi[email protected]
  • Buscando la diferencia entre struct en C y C++? Ver aquí.
  • No «toda» la gente hacer! Aquellos que hacen que sea simplemente prefieren, o no se dan cuenta de lo que struct significa en C++. 😉 Pero no hay ninguna razón usted no puede usar el class palabra clave.
InformationsquelleAutor palm3D | 2008-09-18

30 Comentarios

  1. 454

    Olvidar el difícil 2ª diferencia entre las clases y estructuras.

    Quoth la norma (artículo 11.2.2 en C++98 a través de C++11):

    En ausencia de un el acceso especificador de
    para una clase base, el público es asumido
    cuando la clase derivada se declara
    struct y privado, se supone que cuando la clase se declara clase.

    Y sólo para la integridad en sí, el más ampliamente conocido diferencia entre la clase y la estructura que se define en (11.2):

    Miembro de una clase se define con el
    palabras clave clase son privado por
    por defecto. Los miembros de una clase definida
    con las palabras clave struct o unión
    son público por defecto.

    Diferencia adicional: la palabra clave class se puede utilizar para declarar los parámetros de la plantilla, mientras que el struct palabra clave no se utiliza con tal fin.

    • Eso no es realmente una segunda diferencia, es que la pregunta declaró la diferencia de forma incompleta. Todos los subobjetos son privadas por defecto cuando se utiliza el class, públicos por defecto con struct, y a definir un tipo de clase.
    • Creo que te has perdido el punto, Ben. Es la herencia que el público de estructuras y privada para las clases. Esa es una distinción muy importante, y completamente ajena a los reales de acceso de los miembros. Por ejemplo, el lenguaje podría muy bien haber definido de otra manera, por ejemplo, tanto pública heredada por defecto, y te sería implicaciones muy distintas.
    • En realidad, el verdadero complicado diferencia entre struct y class es que el último puede ser utilizado en lugar de un typename para declarar un parámetro de plantilla, mientras que el primero no. :)
    • Y no olvides que mediante el uso de class en lugar de typename puede dejar que los usuarios accedan a los tipos primitivos en una plantilla.
    • Al mejor de mi conocimiento si dices template<typename T> le permite incluir cualquier tipo, pero si usted dice template<class T> rechazará los tipos primitivos. No he comprobado esto, pero tal vez se rechaza una estructura demasiado.. no lo creo, aunque.
    • Esto es totalmente equivocado. (Hay una escuela que utiliza esta por una convención, pero no es sintácticamente forzada.)
    • Yo lol ed pero para ser justos, acceder a los especificadores de puede modificar la forma en que la estructura/clase que se accede.
    • Se han creado bastante confusión por mencionar typename. la clase se utiliza como la palabra typename en el parámetro de plantilla, no es el mismo uso de la palabra como de la clase cuando se declara la clase o estructura. de la plantilla, la clase y la estructura no se puede citar en el mismo contexto en el que se han tratado. el nombre es la palabra más correcta para lo que se quiere decir con la plantilla. Lo que es complicado es su manera de tratar de explicarlo.
    • real complicado diferencia entre la estructura y la clase» — Lindo, pero la pregunta es acerca de la diferencia entre un struct y un de la clase, no se trata de diferencias en las palabras clave pueden ser utilizados.
    • son estos realmente las únicas diferencias? Me parece difícil creer que sin un poco de historia de la estándar – ¿por qué fueron las clases Y estructuras ambos incluidos en la norma, si la única diferencia es azúcar sintáctico? Esta respuesta también se carece de «razones para la elección de uno u otro en OO diseño», una gran parte de la pregunta.
    • Estás confundiendo «clases» (y «estructuras», que C++ no tiene) con las palabras clave class y struct. Leer stackoverflow.com/a/34907535/560648.
    • También enum struct no es permitido por la norma actual ([dcl.enum]).

  2. 159

    Citando El C++ FAQ,

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

    Los miembros y clases base de un
    struct son públicos por defecto, mientras que en
    la clase, que de forma predeterminada a los privados. Nota:
    usted debe hacer sus clases base
    explícitamente público, privado, o
    protegidos, en lugar de confiar en el
    los valores predeterminados.

    Estructura y la clase de otra manera
    funcionalmente equivalente.

    OK, basta de que absolutamente limpio
    techno hablar. Emocionalmente, la mayoría de los
    los desarrolladores de hacer una fuerte distinción
    entre una clase y una estructura. Un
    struct simplemente se siente como una pila abierta
    de bits con muy poco en el camino de
    la encapsulación o funcionalidad. Un
    la clase se siente como un ser vivo y
    miembro responsable de la sociedad con
    servicios inteligentes, un fuerte
    la encapsulación de la barrera, y un
    interfaz definida. Ya que es el
    connotación la mayoría de la gente ya tiene,
    probablemente, usted debe utilizar la estructura
    palabra clave si se tiene una clase que tiene
    muy pocos métodos y cuenta pública de datos
    (tales cosas existen en bien diseñado
    sistemas!), pero de lo contrario se debe
    probablemente el uso de la palabra clave class.

  3. 121

    Vale la pena recordar que C++orígenes, y la compatibilidad con C.

    C ha structs, no tiene ningún concepto de encapsulación, así que todo es público.

    Ser de dominio público, por defecto se considera generalmente que es una mala idea cuando se está tomando un enfoque orientado a objetos, por lo que en la fabricación de una forma de C que es de forma nativa propicio para la programación orientada a objetos (se puede hacer OO en C, pero no va a ayudar a usted), que era la idea en C++ (originalmente «C Con Clases»), tiene sentido que los miembros privados de forma predeterminada.

    Por otro lado, si Stroustrup había cambiado la semántica de struct fin de que sus miembros eran privadas por defecto, habría roto la compatibilidad (ya no tan a menudo tan verdadero como el de los estándares de la divergencia, pero válidos todos los programas en C también eran válidos los programas de C++, que tenía un gran efecto en dar de C++ de un punto de apoyo).

    Así una nueva palabra clave, class fue introducido a ser exactamente igual a la de una estructura, pero privadas de forma predeterminada.

    Si C++ había llegado desde cero, sin historia, es probablemente habría sólo una de esas palabras clave. Es también, probablemente, no habría hecho el impacto hizo.

    En general, las personas tienden a utilizar struct cuando están haciendo algo similar a cómo las estructuras se utilizan en C; miembros del sector público, ningún constructor (siempre y cuando no sea en un sindicato, puede han constructores de estructuras, al igual que con las clases, pero las personas tienden a no), no a los métodos virtuales, etc. Ya que las lenguas son como mucho para comunicarse con la gente que lee el código como para instruir a las máquinas (o por el contrario nos pegan con la asamblea y raw VM opcodes) es una buena idea para que con el palo.

    • Es probable que también vale la pena señalar que es probable que sea más fácil para las clases y las estructuras de trabajo de la misma bajo el capó, que tener que ser fundamentalmente diferente. No podría, en retrospectiva, han sido algunos beneficios, por ejemplo, la especificación de que nada declarada como una estructura que debe ser una de las VAINAS (es decir, prohibiendo estructuras de tener los miembros virtuales, no trivial defecto constructores o destructores, etc.) pero tal cosa no ha a mi conocimiento nunca ha sido requerido por cualquier estándar de C++ ni aplicación.
    • el tipo de distinción entre la llanura-de vieja data/otros en sí viene de la experiencia de principios de C++ se usa, que por supuesto necesitan principios de C++ que venir primero. La primera aplicación fue en realidad macros que re-escribió el class como struct, los miembros como funciones con el this puntero explícita, y así sucesivamente. Como tal, la mayoría sin duda era más fácil para que funcionen de la misma manera!
    • C++ no fue el primer lenguaje orientado a objetos, y dudo que es el primero en reconocer las VAINAS como un concepto. El punto de que una temprana C++ front-end podía caso en gran parte de las estructuras que existían dentro de código al mismo tiempo que se crean las estructuras de su propio ciertamente va un largo camino para explicar por qué C++ se comporta como lo hace.
    • el hecho de que se trataba de un OO idioma en el que un amplio repertorio de programas escritos en un no-OO idioma eran válidas programas, llevó el concepto a la palestra, y parece que vienen más de los que hay en más puramente OO de idiomas (y, por supuesto, es en realidad definida en el estándar). La historia de la educación C++ sin duda explica mucho acerca de ella. Stroustrup «El Diseño y la Evolución de C++» es una lectura muy interesante.
    • Percibo una guerra religiosa entre las personas que sienten que todo lo que no es «la programación orientada a objetos-ish», debe ser, y los que piensan que la programación orientada a objetos, debe ser considerado como un de la herramienta, pero no el de la herramienta. C++ ciertamente parece abrazar la última filosofía, pero yo realmente no sé mucho acerca de los idiomas antes. Mi propia filosofía es que cuando uno quiere que un objeto se debe utilizar un objeto, y cuando uno quiere a una agregación de los relacionados pero independientes de las variables, se debe usar eso. C++ no hace ninguna distinción sintáctica entre esos tipos de cosas, y .NET intenta difuminar esta distinción, pero lo poco que sé de D…
    • …sugiere que se reconoce más que C++ o .NET. Las agregaciones de las variables no se exactamente OOPish, pero eso no significa que no deberían ser empleados cuando son útil.
    • No estoy de acuerdo con «C ha structs, no tiene ningún concepto de encapsulación, así que todo es público.», Puede ocultar una definición de un struct dentro de un *.c-Archivo y dejar que otras traducciones unidades sólo lo uso con un puntero. Así que usted tiene una aún más fuerte de la encapsulación, porque otras traducciones unidades no sé ni lo que está dentro de la struct.

  4. 31

    Clase’ miembros son privados por defecto. Struct miembros son públicos por defecto. Además de que no hay ninguna otra diferencia. Ver también esta pregunta.

    • No sólo los miembros, pero todos los accesos, incluida la herencia.
    • Bueno, yo diría la otra diferencia es semántica. Struct a muchas personas les hace pensar «estructura de datos» como un remanente de C.
    • Esos no son «semántica»; son los sentimientos personales. Ambos struct y class declarar un clase con idéntico semántica (sin perjuicio de analizar sabia interpretación de la definición del cuerpo).
  5. 28

    Según Stroustrup en el Lenguaje De Programación C++ :

    Estilo que uso depende de las circunstancias y el gusto. Por lo general prefieren utilizar struct para las clases que se tienen todos los datos públicos. Creo que de clases tales como «no muy adecuada tipos, acaba de estructuras de datos.»

    Funcionalmente, no hay ninguna diferencia que no sea el público /privado

    • ¿Qué diferencia? Por favor explique.
  6. 10

    ESTRUCTURA es un tipo de Tipo de Datos Abstracto que divide un determinado fragmento de la memoria de acuerdo a la estructura de la especificación. Las estructuras son particularmente útiles en el archivo de la serialización/deserialización como la estructura puede ser a menudo escriben en el archivo de pie de la letra. (es decir, Obtener un puntero a la estructura, utilice el TAMAÑO de la macro para calcular el número de bytes a copiar, a continuación, mover los datos dentro o fuera de la estructura.)

    Las clases son de un tipo diferente de tipo de datos abstracto que en un intento de garantizar ocultar información. Internamente, puede haber una gran variedad de planes, métodos, variables temp, las variables de estado. etc. que son utilizados para presentar un API consistente para cualquier código que desea utilizar la clase.

    En efecto, estructuras son acerca de los datos, las clases son de código.

    Sin embargo, usted necesita entender que estas son meras abstracciones. Es perfectamente posible crear estructuras que se parecen mucho a las clases y clases que se parecen mucho a las estructuras. De hecho, los primeros compiladores de C++ eran meramente pre-compiladores que se traduce en código C++ a C. por Lo tanto, estas abstracciones son un beneficio para el pensamiento lógico, no necesariamente una ventaja para el equipo en sí.

    Más allá del hecho de que cada uno es un tipo diferente de abstracción, Clases de proporcionar soluciones a la C código de nomenclatura de puzzle. Puesto que usted no puede tener más de una función que se exponen con el mismo nombre, los desarrolladores utilizan para seguir un patrón de _(). por ejemplo, mathlibextreme_max(). Mediante la agrupación de las Api en clases, funciones similares (aquí los llamamos «métodos») pueden ser agrupados y protegidos de la nomenclatura de los métodos de otras clases. Esto permite que el programador para organizar su código mejor y aumentar la reutilización de código. En teoría, al menos.

    • Esta es la mayoría de los no-cosa obvia acerca de estructuras y clases. «Estructuras son acerca de los datos, las clases son de código» puede ser reformulado como «estructuras son acerca de los datos, las clases son acerca de los datos, la seguridad y las operaciones realizadas sobre los datos»
    • No es posible crear un struct en C++. Sólo es posible crear una clase con el heredado struct palabra clave.
    • Esta respuesta no parece ser acerca de C++. En C++, struct declara clases (incluyendo public/private/protected, herencia, etc).
    • ¿Cómo son las estructuras abstractas? Escrito raw estructuras a un archivo está plagado de problemas, incluso en C (los problemas habituales incluyen relleno, endianness, palabra diferente tamaño, etc). ¿Qué es esto SIZE macro estás hablando?
  7. 10

    1) los Miembros de una clase son privados por defecto y los miembros de la estructura son públicos por defecto.

    Por ejemplo de programa 1 produce un error en la compilación y 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 deriven de una estructura de una clase o struct, de acceso predeterminado-especificador de una clase base/struct es público. Y cuando derivar una clase, por defecto especificador de acceso es privado.

    Por ejemplo de programa 3 falla en la compilación y 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;
    }
    • He quitado los ejemplos de código de 3 a 7 como se ha mencionado por los expertos
  8. 8

    La única otra diferencia es el valor predeterminado de herencia de las clases y estructuras, que, como era de esperar, es privado y público, respectivamente.

  9. 4

    No en la especificación, no. La diferencia principal está en el programador de expectativas a la hora de leer el código de 2 años. estructuras son a menudo se supone que la VAINA. Las estructuras son también utilizados en la plantilla de metaprogramación cuando se está definiendo un tipo para fines distintos de la definición de objetos.

  10. 4

    Una cosa a tener en cuenta, que si actualiza un legado de la aplicación que había structs el uso de clases puede ejecutar en el siguiente problema:

    Antiguo código de structs, el código fue limpiado y estos cambiado a clases.
    Una función virtual o dos a continuación se añadió a la nueva actualización de la clase.

    Cuando las funciones virtuales están en clases, a continuación, internamente el compilador añade más puntero a los datos de la clase para que apunte a las funciones.

    Cómo se iba a romper con las viejas código de la herencia es que si en el antiguo código en algún lugar de la estructura fue liquidado utilizando memfill para aclarar todo a ceros, esto podría pisar el extra puntero de datos.

    • El código que utiliza la memfill para borrar una estructura que probablemente tiene otras ofensiva hábitos. Ir con precaución.
    • El uso de un cero de relleno para borrar o inicializar una estructura de datos es estándar en C. en un lenguaje mixto proyecto, uno no puede esperar que el código de la parte C para evitar calloc en favor de new. Todo lo que uno puede hacer es tratar de garantizar que las estructuras utilizadas por la C es la parte del código son, de hecho, las VAINAS.
  11. 4
    1. Los miembros de una estructura son públicos por defecto, los miembros de la clase son privados por defecto.
    2. Herencia predeterminada para la Estructura de otra estructura o clase es pública.Defecto de herencia para la clase de otra clase o estructura es privado.
    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.

    • _tmain no es un estándar de C++.
  12. 3

    Otra diferencia principal es que cuando se trata de Plantillas. Hasta donde yo sé, usted puede utilizar una clase cuando se define una plantilla, pero NO una estructura.

    template<class T> //OK
    template<struct T> //ERROR, struct not allowed here
    • Si usted tiene la intención de destacar que las estructuras no pueden ser utilizados como generalizada de los tipos, entonces usted equivocado. Y struct no está permitido no sólo por convención (mejor decir que es class palabra clave que se usa en sentido diferente aquí, vea el Uso de ‘clase’ o ‘nombre’ para los parámetros de la plantilla).
    • La palabra clave no está permitido, pero puede pasar en una clase se define con struct bien. Simplemente probarlo. struct T{}; template <typename T> void foo() {} foo<T>();
  13. 3
    1. Miembro de una clase se define con la palabra clave class son private por defecto. Los miembros de una clase se define con las palabras clave struct (o union) son public por defecto.

    2. En ausencia de un acceso especificador de una clase base, public se asume cuando el derivados clase se declara struct y private se supone que cuando la clase se declara class.

    3. Puede declarar una enum class pero no un enum struct.

    4. Puede utilizar template<class T> pero no template<struct T>.

    Nota también de que el estándar de C++ le permite reenviar la declaración de un tipo como struct y, a continuación, utilizar class al declarar el tipo y vice-versa. También, std::is_class<Y>::value es true para Y ser un struct y un class, pero es false para un enum class.

    • bonita respuesta, a pesar de que me estoy perdiendo una clara inconfundible 0) la diferencia entre struct y class en c++ es una diferencia entre las palabras clave, no entre tipos de datos (o alguna alternativa mejor 😉
    • Pero no creo que std::is_class<Y>::value que cubre?
    • sí, pensé que podría ser más prominente, porque ese es el error común y una vez que eso fuera del camino, el resto es sólo corolarios.
    • No importa, tu respuesta es perfecta como es, me escribió el otro, no duele tener uno más
  14. 2

    Es sólo una convención. Las estructuras pueden ser creados para contener datos simple pero más tarde evolucionar en el tiempo con la adición de funciones miembro y constructores. Por otro lado es inusual ver otra cosa que la pública: acceso en una estructura.

  15. 2

    ISO IEC 14882-2003

    9 Clases

    §3

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

  16. 1

    Las otras respuestas han mencionado la privada/pública de valores predeterminados, (pero tenga en cuenta que una estructura es una clase es una estructura, no son dos elementos distintos, a sólo dos maneras de definir el mismo tema).

    Lo que podría ser interesante tener en cuenta (especialmente desde que el autor de la pregunta es probable que el uso de MSVC++ ya que él menciona, «no administrado» C++) es que Visual C++ se queja, bajo ciertas circunstancias, si una clase se declara con class y, a continuación, se define con struct (o posiblemente al revés), aunque la norma dice que es perfectamente legal.

    • Sé que es muy tarde el comentario, pero ser conscientes de que la mencionada advertencia no sin mérito, ya que el Windows ABI daña estructuras y clases de manera diferente y por lo tanto la mezcla (hacia adelante) las declaraciones de la clase y la estructura puede llevar a una situación de difícil comprender la vinculación de los problemas!
  17. 1
    • . En las clases de todos los miembros por defecto son privadas, pero en la estructura
      los miembros son públicos por defecto.

      1. No hay término como constructor y destructor de estructuras, pero para la clase compilador crea por defecto si no se proporcionan.

      2. Sizeof estructura vacía es de 0 Bytes wer como Sizeof vacío de la clase es de 1 Byte que La estructura predeterminada tipo de acceso es público. Una estructura debe
        normalmente se utiliza para agrupar los datos.

      La clase por defecto tipo de acceso es privado, y el modo por defecto
      la herencia es privado. Una clase debe ser utilizada para agrupar los datos y
      los métodos que operan sobre esos datos.

      En resumen, la convención es usar struct cuando el propósito es la
      los datos del grupo y las clases de uso cuando se requiere la abstracción de datos y,
      quizás la herencia.

      En C++ las estructuras y las clases se pasan por valor, a menos que explícitamente
      de referencia. En otros idiomas, clases y estructuras pueden tener
      distintas semántica – es decir. objetos (instancias de clases) pueden ser pasados
      por referencia y las estructuras pueden ser pasados por valor. Nota: Hay
      comentarios asociados a esta pregunta. Ver la página de discusión para
      añadir a la conversación.

    • «2. Sizeof estructura vacía es de 0 Bytes wer como Sizeof vacío de la clase es de 1 Byte». Falso. Acabo de probar con g++. Usted podría estar pensando de Vacío de la Base de la Optimización, pero que se aplica a ambos demasiado.
    • No es cierto. En C++ el tamaño de un vacío de la estructura es de 1. En C un vacío de la estructura no está permitido. GCC permite vacío estructuras en C como una extensión de compilador y un struct tiene tamaño 0.
    • Esta respuesta es errónea. Además el tamaño de la cosa, el constructor/destructor parte también es incorrecta: estructuras pueden tener constructores y destructores bien. De hecho, struct crea completo de clases en C++.
  18. 1

    Mientras implícita por otras respuestas, no se menciona explícitamente – que sus estructuras están C compatible, dependiendo de su uso; las clases no son.

    Esto significa que si usted está escribiendo un encabezado que desea ser C compatible entonces no tienes otra opción que no sea struct (que en el C, el mundo no puede tener funciones; pero puede tener punteros a función).

  19. 1

    La diferencia entre class y struct es una diferencia entre las palabras clave, no entre tipos de datos. Esta dos

    struct foo : foo_base { int x;};
    class bar : bar_base { int x; };

    tanto definir un tipo de clase. La diferencia de las palabras clave en este contexto es el diferente acceso predeterminado:

    • foo::x es público y foo_base es heredado públicamente
    • bar::x es privado y bar_base se hereda de forma privada
    • +1
  20. -1

    Clase sólo tiene sentido en el contexto de la ingeniería de software. En el contexto de las estructuras de datos y algoritmos, la clase y la estructura no son diferentes. No hay ninguna regla restringido que el de la clase de los miembros debe ser de referencia.

    Cuando el desarrollo de grandes proyectos con un montón de gente sin clase, usted puede finalmente obtener complicado junto código porque todo el mundo usar cualquiera de las funciones y datos que desea. la clase proporciona permiso controles y inherents para mejorar la disociación y la reutilización de códigos.

    Si lees algunos principios de la ingeniería de software, usted encontrará que la mayoría de las normas no puede ser implementado fácilmente sin clase. por ejemplo:
    http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

    Por CIERTO, Cuando una estructura que asigna un crujido de memoria e incluye varias variables, el valor de las variables de tipo indica que los valores son embbeded en donde la estructura es asignado. En contraste, el tipo de referencia de la variable valores son externos y de referencia por un puntero que también está incrustada en donde la estructura es asignado.

    • Esta respuesta no parece ser acerca de C++. En C++, struct declara clases (incluido el permiso de los controles, la herencia, etc).
  21. -1

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

    √ CONSIDERAR la posibilidad de definir una estructura en lugar de una clase si las instancias de la
    tipo son pequeñas y generalmente de corta duración o son comúnmente incrustado en
    otros objetos.

    X EVITAR la definición de una estructura, a menos que el tipo tiene todas las de
    las siguientes características:

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

    Tiene una instancia
    tamaño de menores de 16 bytes.

    Es inmutable.

    No tendrá que ser en caja
    con frecuencia.

    • De que trata .NET/C#, no en C++.
  22. -2

    La diferencia entre struct y clase palabras clave de C++ es que, cuando no se especifica ningún especificador en particular, los compuestos de tipo de datos de forma predeterminada, se struct o unión es que el público las palabras clave que sólo considera los datos esconde, pero la clase es la palabra clave privada que considera la ocultación de los códigos de programa o de datos. Siempre algunos programadores utilizan struct de datos y clase para el código de bien. Para más contacto de la información de otras fuentes.

    • OP ya se ha mencionado que struct miembros son públicos por defecto, y la aceptación de la respuesta de 2009 menciona la herencia. ¿Por qué escribir otra respuesta que no añade información nueva 4 años más tarde?
  23. -2

    De todos estos factores,se puede concluir que el concepto de Clase es muy adecuada para representar los objetos del mundo real en lugar de «Estructuras».En gran parte debido a la programación orientada a objetos conceptos utilizados en clase son muy prácticos en la explicación de situaciones del mundo real, por tanto, más fáciles de combinar a la realidad.Por ejemplo,la herencia predeterminada es público para los structs pero si se aplica esta regla para el mundo real,es ridículo.Pero en una clase por defecto es la herencia privada que es más realista.

    De todos modos,lo que yo necesito para justificar Clase es mucho más amplio,del mundo real, aplicable concepto, mientras que la Estructura es un primitivo Concepto con una mala organización interna(Apesar de la estructura sigue a la programación orientada a objetos conceptos,que tienen un mal sentido)

    • Cómo es la herencia privada «más realista»? La mayoría de los lenguajes de programación no tienen el concepto de la herencia privada.
  24. -3

    La principal diferencia entre la estructura y la clase de palabras clave en uy es que, sin público y privado de la declaración del miembro presente en la estructura.y los datos miembro y la función puede ser definida como públicas, privadas, así como protegidos.

    • Esta respuesta no parece ser acerca de C++. En C++, struct declara clases (incluyendo public/private/protected, herencia, etc).
  25. -4

    He encontrado otra diferencia. si no se define un constructor en una clase, el compilador va a definir uno. pero en una estructura si no se define un constructor, el compilador no definir un constructor demasiado. así, en algunos casos que realmente no necesita un constructor, struct es una mejor opción (rendimiento de la punta).
    y lo siento por mi mala inglés.

    • Esto no es cierto. No hay ninguna diferencia entre una clase se define con la struct de palabras clave y de una clase se define con la class palabra clave en este sentido.
    • cuando yo uso una estructura con un constructor, puedo obtener una mejor velocidad de una clase con un constructor.
    • Post algunas mediciones.
    • Tú No.
  26. -4

    Las clases son tipos de Referencia y las Estructuras son tipos de Valores.

    Cuando digo que las Clases son tipos de referencia,

    básicamente, que contendrá la dirección de las variables 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 main,

    Puedo crear una instancia de esta clase mediante un nuevo operador que asigna memoria para esta clase

    y almacena la dirección de la base de que en Miclase tipo de variable(_myClassObject2).

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

    En el programa anterior,
    Miclase _myClassObject2 = _myClassObject1;
    la instrucción indica que ambas variables de tipo Miclase

    1. myClassObject1
    2. myClassObject2

    y apuntará a la misma ubicación de memoria.

    Se asigna básicamente la misma ubicación de memoria en otra variable del mismo tipo.

    Así que si cualquier cambio que hagamos en uno de los objetos de tipo Miclase tendrán un efecto sobre la otra

    ya que ambos apuntan a la misma ubicación de memoria.

    «_myClassObject1.DataMember = 10;» en esta línea, tanto el objeto de miembros de datos que contendrá el valor de 10.

    «_myClassObject2.DataMember = 20;» en esta línea, tanto el objeto del miembro de datos se contiene el valor de 20.

    Finalmente, estamos accediendo a datamembers 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,

    crear una instancia del objeto de MyStructure tipo utilizando el operador new y

    el almacenamiento de dirección en _myStructObject variable de tipo MyStructure y

    la asignación de valor 10 para los datos de los miembros de la estructura con «_myStructObject1.DataMember = 10».

    En la línea siguiente,

    Estoy declarando una variable _myStructObject2 de tipo MyStructure y la asignación de _myStructObject1 en que.

    Aquí .NET C# compilador crea otra copia de _myStructureObject1 objeto y

    asigna la ubicación de la memoria en MyStructure variable _myStructObject2.

    Así que cualquier cambio que realice en _myStructObject1 nunca va a tener un efecto sobre otra variable _myStructObject2 de tipo MyStructrue.

    Por eso estamos diciendo que las Estructuras son tipos de valor.

    De manera inmediata de la clase Base de la clase es el Objeto inmediato y de la clase Base de la Estructura es ValueType que hereda de Object.

    Clases de apoyo de una Herencia, mientras que las Estructuras no.

    Cómo estamos diciendo que?

    Y ¿cuál es la razón detrás de todo esto?

    La respuesta es Clases.

    Puede ser abstracto, sellado estático, y parcial, y no pueden ser Privados, Protegidos y protegidas interna.

    • Creo que esto es tratando de responder a la pregunta de c#? La pregunta es acerca de c++, y que hace que esta respuesta incorrecta, ¿verdad?
    • absolutamente, ha escrito en su código de ejemplo en C# y me vine aquí para comprobar que no había una diferencia en el paso de parámetros entre C++ struct y class. Aquí nadie ha dicho, ni toda la web. Así que no creo que esto se aplica a la de C++, ya sea.
    • Esto no es válido código de C# – las palabras clave son equivocadas. «Público», «Estático», «Int», y la «Clase» no debe estar en mayúsculas y debe ser «struct» no «Estructura». Descripción es en su mayoría precisa para C# (a pesar de estructuras todavía puede heredar interfaces, no sólo de otras estructuras), pero no responde a la pregunta ya que se trataba de C++…
    • Esta respuesta es una completa tontería. Se utiliza una mezcla extraña de Visual Basic y C# para sus ejemplos de código, y el conjunto de «las Clases son tipos de Referencia y las Estructuras son tipos de Valores»… cosa que sólo se aplica a .NETO (es decir, C#) no C++. Estás en la habitación del mal, amigo. Aquí es donde usted pertenece : stackoverflow.com/questions/13049
    • Pero esta respuesta indica que el mismo es válido para C(++), que las estructuras se utilizan como los tipos de valor. int a = 3; int b = a; y similares MyStruct a=MyStruct("data"); MyStruct b = a;
    • Que también funciona para las clases: std::vector<int> a {1, 2, 3}; std::vector<int> b = a;.

  27. -4

    La principal diferencia entre la estructura y la clase es que en la estructura sólo puede declarar variables de datos de diferentes tipos de datos, mientras que en la clase se pueden declarar variables de datos,funciones miembro y por lo tanto se puede manipular las variables de datos a través de funciones.

    -> otra cosa muy útil que puedo encontrar en la clase vs struct es que mientras que la implementación de archivos en un programa, si desea realizar algunas operaciones de una estructura una y otra vez en cada nuevo conjunto de operaciones que debe realizar una función por separado y que usted necesita para pasar un objeto de la estructura después de la lectura del archivo, así como para realizar algunas operaciones sobre ella .
    mientras que en la clase si hacer una función que realiza algunas operaciones sobre los datos necesarios cada vez..es muy fácil solo debes leer objeto de archivo y llamar a la función..

    Pero depennds en el programador, que forma en que él/ella considera adecuado…según yo prefiero clase cada vez sólo porque admite Uy y esa es la razón por la que se implementa en casi todos los idiomas y su característica maravillosa de todos los tiempos de programación 😉

    Y, sí, el más inolvidable diferencia que se me olvidó mencionar es que la clase admite ocultar datos y también es compatible con las operaciones que se realizan en la construcción de tipos de datos, mientras que la estructura no !

    • En C++ struct puede tener funciones miembro
    • Gracias… tengo que saber acerca de esta característica sólo ahora.. muchas gracias.. yo sólo soy un beginer no como experto, ya que en el futuro también necesita consejos de u chicos 🙂
    • y en realidad, la función de miembro es a ser concebido en su sentido más amplio. struct pueden tener constructores, miembro de la función y distructor (posiblemente virtual, posiblemente private, protected o public). Se puede heredar y ser heredado. así que en realidad… todo lo que una clase puede tener. una típicos de la convención es declarar con struct lo que habría declarado como struct en C, y como clase si declaramos privados y protegidos de variables, funciones virtuales, cto r y dtor, y así sucesivamente. Pero es sólo una convención, no se aplican por el idioma
  28. -4

    **ACTUALIZACIÓN: ** por Favor, ignore esta respuesta. Yo no considerar la posibilidad de que para la estructura, el valor fue sin inicializar, pero sólo pasó a ser 0. No hay una inicialización de la diferencia entre la estructura y la clase.


    Estoy viendo otra 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();
    }

    Ejecutar ese código y examinar myTester. Usted encontrará que para m_Foo, la estructura, m_Foo.una ha sido inicializado a 0, pero para m_Bar, la clase, m_Bar.una está sin inicializar. Así, parece haber una diferencia en lo que el constructor predeterminado para struct frente de la clase. Estoy viendo esto con Visual Studio.

    • ¿Cómo determinar que m_Foo.a fue inicializado? Lo que si fue sin inicializar y sólo pasó a ser 0?
    • Uhhh, yo no. Mi mal. Esta no es una diferencia entre la estructura y la clase. Inicialización de las características son las mismas.
  29. -8

    Hay 3 diferencia básica entre la estructura y la clase

    1 de la memoria están reservados para la estructura en memoria de pila (que se encuentra cerca del lenguaje de programación )ya sea para la clase en la pila de memoria reservada para sólo reffrence y real de la memoria están reservados en la memoria heap.

    2º – Por defecto de la estructura de tratar como a un público ya sea de la clase de tratar como privado .

    3º – no se puede volver a utilizar el código en la estructura pero en clase podemos volver a utilizar el mismo código en el tiempo de muchos llamados inhertence

    • C++ estructuras de soporte de la herencia y métodos abstractos. La estructura y la clase se asignan de la misma manera. La asignación de clase en el montón, incluso si no se crea una instancia con un «nuevo» no tiene sentido para sistemas embebidos.
    • #1 también es incorrecto. La pila se utiliza cuando se declara algo de ese tipo como una variable local, y el montón se utiliza cuando se utiliza el operador «new».

Dejar respuesta

Please enter your comment!
Please enter your name here