Estructura C/C++ vs Clase

Resuelto asked hace 14 años • 7 respuestas

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?

 avatar May 01 '10 21:05
Aceptado

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.

Antal Spector-Zabusky avatar May 01 '2010 14:05 Antal Spector-Zabusky

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

Lance Diduck avatar May 01 '2010 15:05 Lance Diduck

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

Classes 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. StructFunciona 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 classexistan para admitir la encapsulación y otros conceptos de codificación relacionados, structpara los cuales los s simplemente no son muy útiles.

Dave avatar Oct 14 '2016 16:10 Dave