Pregunta

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.

¿Fue útil?

Solución

Olvida el complicado 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 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 la unión son público de forma predeterminada.

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.

Otros consejos

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.

Struct 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.

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

C tiene 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 por lo 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í que 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 que 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 de comunicarse con la gente de la lectura de 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.

La 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.

De acuerdo a Stroustrup en el Lenguaje De Programación C++ :

El estilo que utiliza 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

La 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 a menudo puede ser escrito 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, las estructuras son acerca de los datos, las clases son sobre el 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.

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

Por ejemplo el 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, el programa 3 produce un error 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;
}

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.

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.

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:

Código antiguo ha 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.

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

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
  1. Miembro de una clase se define con la palabra clave class son private de forma predeterminada.Los miembros de una clase se define con las palabras clave struct (o union) son public de forma predeterminada.

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

  3. Usted puede declarar una enum class pero no un enum struct.

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

Tenga en cuenta también 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.

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

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

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.

ISO IEC 14882-2003

9 Clases

§3

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

Las otras respuestas han mencionado el público/privado predeterminados, (pero tenga en cuenta que una estructura es una clase es una estructura;no son dos elementos diferentes, 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.

  • .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 predeterminada 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.

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).

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; };

ambos definen 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 se hereda públicamente
  • bar::x es privado y bar_base se hereda de forma privada

La 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 los códigos.

Si la lectura de 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.

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 tiene que ser en caja con frecuencia.

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 struct o la unión es el público de 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 para los datos y clase para el código de bien.Para más información contactar con otras fuentes.

Fuera 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)

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.

He encontrado una 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 mal inglés.

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 se apuntan 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 escribir con 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 eso?
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.

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 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 desde el 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 se encuentra 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 !

**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 vsclase.Estoy viendo esto con Visual Studio.

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

1º - 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top