Estructura C/C++ vs Clase
Después de terminar mi clase de C++, me pareció que las estructuras/clases son prácticamente idénticas excepto con algunas diferencias menores.
Nunca antes había programado en C; pero sí sé que tiene estructuras. ¿En C es posible heredar otras estructuras y establecer un modificador de público/privado?
Si puedes hacer esto en C normal, ¿por qué necesitamos C++? ¿Qué diferencia a las clases de una estructura?
En C++ , las estructuras y las clases son prácticamente iguales; la única diferencia es que cuando los modificadores de acceso (para variables miembro, métodos y clases base) en las clases son privados por defecto, los modificadores de acceso en estructuras son públicos por defecto.
Sin embargo, en C , una estructura es solo una colección agregada de datos (públicos) y no tiene otras características similares a las de una clase: ni métodos, ni constructor, ni clases base, etc. Aunque C++ heredó la palabra clave, extendió la semántica. (Esta, sin embargo, es la razón por la cual las cosas por defecto son públicas en las estructuras: una estructura escrita como una estructura C se comporta como tal).
Si bien es posible falsificar algo de programación orientada a objetos en C (por ejemplo, definir funciones que toman un puntero a una estructura como primer parámetro, u ocasionalmente obligar a estructuras con los mismos primeros campos a ser "sub/superclases"), siempre es una especie de atornillado y en realidad no es parte del lenguaje.
Aparte de las diferencias en el acceso predeterminado (público/privado), no hay diferencia.
Sin embargo, algunas tiendas que codifican en C y C++ usarán "class/struct" para indicar qué se puede usar en C y C++ (struct) y cuáles son solo C++ (class). En otras palabras, en este estilo todas las estructuras deben funcionar con C y C++. Esta es la razón por la que hubo una diferencia en primer lugar hace mucho tiempo, cuando C++ todavía se conocía como "C con clases".
Tenga en cuenta que las uniones de C funcionan con C++, pero no al revés. Por ejemplo
union WorksWithCppOnly{
WorksWithCppOnly():a(0){}
friend class FloatAccessor;
int a;
private:
float b;
};
Y de la misma manera
typedef union friend{
int a;
float b;
} class;
solo funciona en C
Voy a agregar respuestas a las existentes porque el C++ moderno ahora existe y se han creado pautas básicas oficiales para ayudar con preguntas como estas.
Aquí hay una sección relevante de las pautas:
C.2: Usar clase si la clase tiene una invariante; use struct si los miembros de datos pueden variar de forma independiente
Una invariante es una condición lógica para los miembros de un objeto que un constructor debe establecer para que asuman las funciones de miembro público. Una vez establecido el invariante (normalmente mediante un constructor), se puede llamar a cada función miembro para el objeto. Una invariante se puede expresar de manera informal (por ejemplo, en un comentario) o más formalmente usando Expects.
Si todos los miembros de los datos pueden variar independientemente unos de otros, no es posible ninguna invariante.
Si una clase tiene datos privados, un usuario no puede inicializar completamente un objeto sin el uso de un constructor. Por tanto, el definidor de clase proporcionará un constructor y deberá especificar su significado. Esto significa efectivamente que el definidor necesita definir un invariante.
Aplicación
Busque estructuras con todos los datos privados y clases con miembros públicos.
Los ejemplos de código dados:
struct Pair { // the members can vary independently
string name;
int volume;
};
// but
class Date {
public:
// validate that {yy, mm, dd} is a valid date and initialize
Date(int yy, Month mm, char dd);
// ...
private:
int y;
Month m;
char d; // day
};
Class
es funcionan bien para miembros que, por ejemplo, se derivan entre sí o están interrelacionados. También pueden ayudar con la verificación de cordura al crear instancias. Struct
Funciona bien para tener "bolsas de datos", donde en realidad no sucede nada especial, pero lógicamente tiene sentido que los miembros estén agrupados.
A partir de esto, tiene sentido que class
existan para admitir la encapsulación y otros conceptos de codificación relacionados, struct
para los cuales los s simplemente no son muy útiles.