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

votos
373

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:, 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 las esquinas oscuras de la especificación C ++.

Publicado el 18/09/2008 a las 13:09
fuente por usuario
En otros idiomas...                            


30 respuestas

votos
28

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 .

Respondida el 18/09/2008 a las 13:12
fuente por usuario

votos
1

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.

Respondida el 18/09/2008 a las 13:13
fuente por usuario

votos
4

No en la especificación, no. La diferencia principal está en las expectativas del programador 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 metaprogramación de plantillas cuando se define un tipo para fines distintos de la definición de objetos.

Respondida el 18/09/2008 a las 13:15
fuente por usuario

votos
25

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

El estilo que uses depende de las circunstancias y el gusto. Por lo general, prefiero usar structpara 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

Respondida el 18/09/2008 a las 13:15
fuente por usuario

votos
8

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

Respondida el 18/09/2008 a las 13:15
fuente por usuario

votos
1

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.

Respondida el 18/09/2008 a las 13:17
fuente por usuario

votos
144

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

Respondida el 18/09/2008 a las 13:18
fuente por usuario

votos
8

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 compiladores de C ++ no eran más que 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 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 programador organizar mejor su código y aumentar la reutilización del código. En teoría, al menos.

Respondida el 18/09/2008 a las 13:23
fuente por usuario

votos
4

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

Respondida el 18/09/2008 a las 14:31
fuente por usuario

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

Respondida el 19/09/2008 a las 09:12
fuente por usuario

votos
424

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 palabra clave classse puede usar para declarar parámetros de plantilla, mientras que la structpalabra clave no se puede usar de esa manera.

Respondida el 16/06/2009 a las 05:19
fuente por usuario

votos
1

ISO IEC 14882-2003

9 Clases

§ 3

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

Respondida el 18/04/2010 a las 08:18
fuente por usuario

votos
100

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

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

Siendo pública por defecto se considera generalmente una mala idea cuando se toma un enfoque orientado a objetos, por lo que en la fabricación de una forma de C, que es nativa propicio para la programación orientada a objetos (OO se puede hacer en C, pero no va a ayudar) que fue el idea en C ++ (originalmente "C con clases"), que tiene sentido para hacer que los miembros privados de forma predeterminada.

Por otro lado, si BS había cambiado la semántica de structmodo que sus miembros fueron privadas de forma predeterminada, se habría roto la compatibilidad (que ya no es tan a menudo es cierto que las normas divergentes, pero todos los programas en C válidos también fueron programas válidos C ++, los cuales tuvieron un gran efecto en C ++ dando un punto de apoyo).

Por lo que una nueva palabra clave, classse introdujo a ser exactamente como una estructura, pero privados de forma predeterminada.

Si C ++ había llegado desde cero, sin antecedentes, entonces probablemente tendría sólo un ejemplo de palabras clave. También probablemente no habría hecho el impacto que hizo.

En general, la gente tiende a utilizar struct cuando están haciendo algo así como la forma en estructuras se utilizan en C; miembros del público, ningún constructor (con tal de que no se encuentra en una unión, que pueden tener constructores de estructuras, al igual que con las clases, pero la gente tiende a no), no hay métodos virtuales, etc. Dado que las lenguas son tanto para comunicarse con la gente que lee el código como para instruir a las máquinas (o de lo contrario nos gustaría seguir con el montaje y códigos de operación VM primas) que es una buena idea para seguir con eso.

Respondida el 07/08/2010 a las 22:17
fuente por usuario

votos
-2

He encontrado una otra diferencia. Si no se define un constructor en una clase, el compilador definirá una. pero en una estructura si no se define un constructor, el compilador no definen un constructor también. por lo que en algunos casos que realmente no necesita un constructor, estructura es una mejor opción (la punta de rendimiento). y lo siento por mi mala Inglés.

Respondida el 04/08/2011 a las 12:28
fuente por usuario

votos
1

Las otras respuestas han mencionado los valores por defecto públicos / privados, (pero tenga en cuenta que una estructura es una clase es una estructura, no son dos elementos diferentes, sólo dos maneras de definir el mismo artículo).

Lo que podría ser interesante observar (en particular desde el autor de la pregunta es probable que sea utilizando MSVC ++ ya que él menciona "no administrado" C ++) es que Visual C ++ se queja bajo ciertas circunstancias si una clase se declara con classy luego definió con struct(o, posiblemente, a la inversa ), aunque la norma dice que es perfectamente legal.

Respondida el 04/08/2011 a las 13:25
fuente por usuario

votos
3

Otra diferencia principal es cuando se trata de plantillas. Por lo que yo sé, es posible utilizar una clase cuando se define una plantilla pero no una estructura.

template<class T> // OK
template<struct T> // ERROR, struct not allowed here
Respondida el 12/11/2011 a las 09:21
fuente por usuario

votos
2
  • . En las clases de todos los miembros por defecto son privadas pero en miembros de la estructura son públicos por defecto.

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

    2. estructura vacía sizeof es 0 bytes wer como sizeof clase vacía es de 1 byte El tipo de estructura de acceso predeterminado es público. A struct típicamente se debe utilizar para agrupar datos.

    El tipo de acceso predeterminado de clase es privado, y el modo por defecto para la herencia es privada. Una clase se debe utilizar para agrupar los datos y métodos que operan sobre esos datos.

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

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

Respondida el 10/07/2012 a las 18:07
fuente por usuario

votos
-1

La diferencia entre struct y de clase palabras clave en C ++ es que, cuando no hay especificador específica sobre el tipo particular de datos compuesta entonces por defecto struct o union es las palabras claves públicas que simplemente considera ocultación de datos, pero la clase es la palabra clave privada que tiene en cuenta el ocultamiento del programa códigos o datos. Siempre algunos programadores utilizan estructura de datos y la clase por causa código. Para obtener más información de contacto de otras fuentes.

Respondida el 15/04/2013 a las 12:57
fuente por usuario

votos
-1

De todos estos factores, se puede concluir que el concepto de clase es muy adecuado para representar objetos del mundo real en lugar de "estructuras" .Largely porque los conceptos de POO utilizados en clase son muy prácticos para explicar escenarios del mundo real, por tanto, más fácil de fusionar a la realidad. por ejemplo, la herencia por defecto es pública para estructuras, pero si aplicamos esta regla para el mundo real, se ridiculous.But en una clase de herencia predeterminado es privada, que es más realista.

De todas formas, lo que necesito para justificar es la clase es un concepto aplicable mundo real mucho más amplio, mientras que la estructura es un concepto primitivo con una mala organización interna (Eventhough estructura siguiente manera conceptos de POO, tienen un significado pobres)

Respondida el 27/08/2013 a las 00:22
fuente por usuario

votos
-3

Las clases son tipos de referencia y las estructuras son tipos de valores.
Cuando digo clases son los tipos de referencia,
básicamente, que contendrán la dirección de una 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 principal,
que puede crear una instancia de esta clase mediante nuevo operador que asigna memoria para esta clase
y almacena la dirección de base de que en MyClass variable de tipo (_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; de instrucciones indica que ambas variables de tipo MiClase

  1. myClassObject1
  2. myClassObject2

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

Así que si cualquier cambio que hagamos en cualquiera de los objetos de tipo MiClase tendrá un efecto sobre otro
, ya que ambos están apuntando en la misma ubicación de memoria.

"_myClassObject1.DataMember = 10;" en esta línea miembros de datos tanto del objeto contendrá el valor de 10.
"_myClassObject2.DataMember = 20;" en esta línea tanto voluntad miembro de los datos del objeto contiene el valor de 20.
Finalmente, estamos accediendo datamembers de un objeto a través de punteros.

A diferencia de clases, 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 usando nuevo operador y
dirección de almacenar en _myStructObject variable de tipo MyStructure y
la asignación de valor 10 a miembro de datos de la estructura utilizando "_myStructObject1.DataMember = 10".

En la línea siguiente,
estoy declarando otra _myStructObject2 variable de tipo MyStructure y asignar _myStructObject1 en eso.
Aquí .NET C # compilador crea otra copia del objeto _myStructureObject1 y
asigna esa ubicación de memoria en MyStructure _myStructObject2 variable.

Así que cualquier cambio que hagamos en _myStructObject1 nunca tendrá un efecto sobre otra variable de tipo _myStructObject2 MyStructrue.
Es por eso que estamos diciendo estructuras son tipos de valor.

Por lo que la clase base inmediata para la clase de objeto es y Clase base inmediata para la estructura es ValueType que hereda de Object.
Las clases serán apoyar una herencia mientras que las estructuras no lo hará.

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

Puede ser abstracto, cerrado, estático y parcial y no puede ser privado, protegido y protegido interna.

Respondida el 25/09/2013 a las 09:54
fuente por usuario

votos
-2

La principal diferencia entre la estructura y la clase de palabras clave en Uy es que, sin declaración de miembro públicas y privadas presentes en structure.and el miembro de datos y la función de miembro pueden ser definidas como públicas, privadas, así como protegidos.

Respondida el 28/01/2014 a las 17:50
fuente por usuario

votos
-6

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

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

2 - Por estructura por defecto a tratar como un regalo pública si la clase como privado.

3ra no puede volver código -uso de estructura, sino en la clase que puede volver a utilizar mismo código en muchos tiempo llamado inhertence

Respondida el 05/12/2014 a las 12:45
fuente por usuario

votos
-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, estructura de clases y no son tan diferentes. No hay ninguna regla es limitado miembro de esa clase debe ser referenciado.

En el desarrollo de proyecto grande con un montón de gente sin clase, es posible que, finalmente, obtener el código junto complicada porque todo el mundo lo utilizan las funciones y los datos que quieren. clase proporciona controles de permisos y inherents para mejorar el desacoplamiento y la reutilización de códigos.

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

Por cierto, Cuando un struct asigna un crujido de memoria e incluye varias variables, variables de tipo valor indica que los valores se embbeded en donde se asigna struct. En contraste, los valores de tipo de referencia de variables son externos y de referencia por un puntero que también está incrustado en donde se asigna struct.

Respondida el 16/03/2015 a las 14:49
fuente por usuario

votos
-1

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

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

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

Es lógicamente representa un único valor, similar a los tipos primitivos (int, doble, etc.).

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

Es inmutable.

No tendrá que ser en caja con frecuencia.

Respondida el 01/05/2015 a las 11:30
fuente por usuario

votos
-2

Estoy viendo otra diferente entre estructuras y clases que tienen que ver con la inicialización por defecto.

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.a se ha inicializado a 0, pero para m_Bar, la clase, m_Bar.a no está inicializado. Por lo que no parece haber una diferencia en lo que hace el constructor por defecto para la clase de estructura vs. Estoy viendo esto con Visual Studio.

Respondida el 15/07/2015 a las 17:21
fuente por usuario

votos
7

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

Por ejemplo el programa 1 falla en la recopilació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) Al derivar una estructura de una clase / estructura, por defecto el acceso especificador de una clase base / struct es público. Y cuando se deriva una clase, acceso predeterminado especificador es privada.

Por ejemplo el programa 3 falla en la recopilació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;
}
Respondida el 24/07/2015 a las 04:44
fuente por usuario

votos
1

Mientras que implica otras respuestas, no está explícitamente mencionado - que las estructuras son compatibles C, dependiendo del uso; las clases no son.

Esto significa que si usted está escribiendo un encabezado que desea ser compatibles C, entonces usted no tiene ninguna opción que no sea struct (que en el mundo C no puede tener funciones, pero puede tener punteros de función).

Respondida el 29/09/2016 a las 07:38
fuente por usuario

votos
-2

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

-> otra cosa práctica que encuentro en la clase vs estructura es que, si bien 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 necesita para hacer una función separada y tiene que pasar objeto de estructura después de leer desde el archivo con el fin de realizar algunas operaciones sobre el mismo. mientras que en la clase si haces una función que hace algunas operaciones sobre los datos necesarios everytime..its fácil solo hay que leer los objetos de archivo y llamar a la función ..

Pero depennds en el programador de qué manera él / ella encuentra adecuada ... según yo prefiero cada clase sólo porque es compatible con los PD y esa es la razón por la que se lleva a cabo en casi todos los idiomas y es la característica maravillosa de toda la programación de tiempo; - )

Y sí, la diferencia más unforgotten me olvidó mencionar es que es compatible con la clase ocultación de datos y también es compatible con las operaciones que se realizan en construido en los tipos de datos struct mientras duerma!

Respondida el 09/06/2017 a las 09:14
fuente por usuario

votos
2
  1. Miembro de una clase definida con la palabra clave classson privatepor defecto. Los miembros de una clase definida con las palabras clave struct(o union) son publicde forma predeterminada.

  2. En ausencia de un acceso-especificador para una clase base, publicse asume cuando el derivado se declara clase structy privatese asume cuando se declara la clase class.

  3. Se puede declarar una enum classpero no una enum struct.

  4. Se puede utilizar template<class T>, pero no template<struct T>.

Tenga en cuenta también que el estándar de C ++ le permite reenviar-declara un tipo como struct, y luego utiliza classcuando se declara el tipo y viceversa. Además, std::is_class<Y>::valuees truepara Y ser un structy una class, pero es falsepara una enum class.

Respondida el 19/12/2018 a las 12:00
fuente por usuario

votos
0

La diferencia entre classy structes una diferencia entre las palabras clave, no entre tipos de datos. Estos 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 por defecto:

  • foo::xes público y foo_basese hereda públicamente
  • bar::xes privado y bar_basese hereda de forma privada
Respondida el 19/06/2019 a las 22:35
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more