¿Cuándo deberías usar una clase frente a una estructura en C++? [duplicar]

Resuelto Alan Hinchcliffe asked hace 16 años • 27 respuestas

¿En qué escenarios es mejor utilizar a structvs a classen C++?

Alan Hinchcliffe avatar Sep 10 '08 23:09 Alan Hinchcliffe
Aceptado

Las diferencias entre a classy a structen C++ son:

  • structLos miembros y las clases/estructuras base son publicpor defecto.
  • class Los miembros y las clases/estructuras base son privatepor defecto.

Tanto las clases como las estructuras pueden tener una combinación de publicy protectedmiembros private, pueden usar herencia y pueden tener funciones miembro.

Yo te recomendaría:

  • úselo structpara estructuras de datos antiguas sin características similares a las de una clase;
  • Úselo classcuando utilice funciones como miembros privateo protected, constructores y operadores no predeterminados, etc.
Commodore Jaeger avatar Sep 10 '2008 16:09 Commodore Jaeger

Como todos los demás señalan, en realidad solo hay dos diferencias de idioma reales:

  • structEl valor predeterminado es el acceso público y classel valor predeterminado es el acceso privado.
  • Al heredar, structel valor predeterminado es publicherencia y classel valor predeterminado es privateherencia. (Irónicamente, como ocurre con tantas cosas en C++, el valor predeterminado es al revés: publicla herencia es, con diferencia, la opción más común, pero la gente rara vez declara structs sólo para ahorrarse la necesidad de escribir la publicpalabra clave " ".

Pero la verdadera diferencia en la práctica es entre un class/ structque declara un constructor/destructor y uno que no lo hace. Hay ciertas garantías para un tipo de POD de "datos antiguos", que ya no se aplican una vez que usted se hace cargo de la construcción de la clase. Para mantener clara esta distinción, muchas personas deliberadamente solo usan structs para tipos POD y, si van a agregar algún método, usan classes. Por lo demás, la diferencia entre los dos fragmentos siguientes no tiene sentido:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(Por cierto, aquí hay un hilo con algunas buenas explicaciones sobre lo que realmente significa "tipo POD": ¿ Qué son los tipos POD en C++? )

quark avatar Jul 28 '2009 04:07 quark

Hay muchos conceptos erróneos en las respuestas existentes.

Ambos classy structdeclarar una clase.

Sí, es posible que tengas que reorganizar tus palabras clave de modificación de acceso dentro de la definición de clase, dependiendo de qué palabra clave usaste para declarar la clase.

Pero, más allá de la sintaxis, la única razón para elegir uno sobre el otro es la convención/estilo/preferencia.

A algunas personas les gusta seguir con la structpalabra clave para clases sin funciones miembro, porque la definición resultante "parece" una estructura simple de C.

De manera similar, a algunas personas les gusta usar la classpalabra clave para clases con funciones miembro y privatedatos, porque dice "clase" y, por lo tanto, parecen ejemplos de su libro favorito sobre programación orientada a objetos.

La realidad es que esto depende completamente de usted y su equipo, y literalmente no hará ninguna diferencia en su programa.

Las dos clases siguientes son absolutamente equivalentes en todos los sentidos excepto en el nombre:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

Incluso puedes cambiar las palabras clave al volver a declarar:

class Foo;
struct Bar;

(aunque esto interrumpe las compilaciones de Visual Studio debido a no conformidades, por lo que el compilador emitirá una advertencia cuando haga esto).

y las siguientes expresiones se evalúan como verdaderas:

std::is_class<Foo>::value
std::is_class<Bar>::value

Sin embargo, tenga en cuenta que no puede cambiar las palabras clave al redefinir ; esto se debe únicamente a que (según la regla de una definición) las definiciones de clases duplicadas en las unidades de traducción deben "consistir en la misma secuencia de tokens" . Esto significa que ni siquiera puedes intercambiar const int member;con int const member;y no tiene nada que ver con la semántica de classo struct.

Lightness Races in Orbit avatar Apr 28 '2016 14:04 Lightness Races in Orbit

La única vez que uso una estructura en lugar de una clase es cuando declaro un funtor justo antes de usarlo en una llamada de función y quiero minimizar la sintaxis en aras de la claridad. p.ej:

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 
Ferruccio avatar Sep 10 '2008 18:09 Ferruccio