¿Cuándo deberías usar una clase frente a una estructura en C++? [duplicar]
¿En qué escenarios es mejor utilizar a struct
vs a class
en C++?
Las diferencias entre a class
y a struct
en C++ son:
struct
Los miembros y las clases/estructuras base sonpublic
por defecto.class
Los miembros y las clases/estructuras base sonprivate
por defecto.
Tanto las clases como las estructuras pueden tener una combinación de public
y protected
miembros private
, pueden usar herencia y pueden tener funciones miembro.
Yo te recomendaría:
- úselo
struct
para estructuras de datos antiguas sin características similares a las de una clase; - Úselo
class
cuando utilice funciones como miembrosprivate
oprotected
, constructores y operadores no predeterminados, etc.
Como todos los demás señalan, en realidad solo hay dos diferencias de idioma reales:
struct
El valor predeterminado es el acceso público yclass
el valor predeterminado es el acceso privado.- Al heredar,
struct
el valor predeterminado espublic
herencia yclass
el valor predeterminado esprivate
herencia. (Irónicamente, como ocurre con tantas cosas en C++, el valor predeterminado es al revés:public
la herencia es, con diferencia, la opción más común, pero la gente rara vez declarastruct
s sólo para ahorrarse la necesidad de escribir lapublic
palabra clave " ".
Pero la verdadera diferencia en la práctica es entre un class
/ struct
que 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 struct
s para tipos POD y, si van a agregar algún método, usan class
es. 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++? )
Hay muchos conceptos erróneos en las respuestas existentes.
Ambos class
y struct
declarar 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 struct
palabra 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 class
palabra clave para clases con funciones miembro y private
datos, 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 class
o struct
.
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());