and c++ class struct

c++ - and - struct vs class c#



C/C++ Struct vs Class (6)

Después de terminar mi clase de C ++, me pareció que las estructuras / clases son prácticamente idénticas, excepto con algunas pequeñas diferencias.

Nunca he programado en C antes; pero sé que tiene estructuras. ¿En C es posible heredar otras estructuras y establecer un modificador de público / privado?

Si puede hacer esto en C normal, ¿por qué en el mundo necesitamos C ++? ¿Qué hace que las clases sean diferentes de una estructura?


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 que se puede usar en C y C ++ (struct) y que son solo C ++ (clase). En otras palabras, en este estilo, todas las estructuras deben funcionar con C y C ++. Esta es una especie de por qué hubo una diferencia en el primer lugar hace mucho tiempo, cuando C ++ todavía se conocía como "C con clases".

Tenga en cuenta que los sindicatos C trabajan 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


C ++ usa estructuras principalmente para 1) compatibilidad hacia atrás con C y 2) tipos de POD. Las estructuras C no tienen métodos, herencia o visibilidad.


No es posible definir funciones miembro o derivar estructuras entre sí en C.

Además, C ++ no es solo C + "derive structs". Las plantillas, referencias, espacios de nombres definidos por el usuario y la sobrecarga del operador no existen en C.


Una diferencia más en C ++, cuando heredas una clase de struct sin ningún especificador de acceso, se convierte en herencia pública donde, como en el caso de la clase, es herencia privada.


Voy a agregar a las respuestas existentes porque el C ++ moderno ahora es una cosa y se han creado Lineamientos básicos oficiales para ayudar con preguntas como estas.

Aquí hay una sección relevante de las pautas:

C.2: Usar clase si la clase tiene un invariante; use struct si los miembros de los datos pueden variar de forma independiente

Un 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. Después de que se establezca el invariante (generalmente por un constructor), se puede llamar a cada función miembro para el objeto. Un invariante puede declararse de manera informal (p. Ej., En un comentario) o más formalmente usar Expectativas.

Si todos los miembros de datos pueden variar independientemente el uno del otro, no es posible ningún invariante.

Si una clase tiene datos privados, un usuario no puede inicializar completamente un objeto sin el uso de un constructor. Por lo tanto, el definidor de clase proporcionará un constructor y debe especificar su significado. Esto efectivamente significa 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 funcionan bien para miembros que, por ejemplo, se derivan o interrelacionan. También pueden ayudar con la comprobación de cordura en instanciación. Struct bien para tener "bolsas de datos", donde realmente no sucede nada especial, pero lógicamente los miembros tienen sentido para agruparse.

A partir de esto, tiene sentido que existan class para soportar la encapsulación y otros conceptos de codificación relacionados, para los cuales las struct simplemente no son muy útiles.


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 clases predeterminadas son privadas, los modificadores de acceso en las estructuras se configuran por defecto como públicos.

Sin embargo, en C , una estructura es solo una colección agregada de datos (públicos), y no tiene otras características tipo clase: ningún método, ningún constructor, ninguna clase base, etc. Aunque C ++ heredó la palabra clave, amplió la semántica. (Esto, sin embargo, es la razón por la cual las cosas se convierten en públicas por defecto en las estructuras, una estructura escrita como una estructura C se comporta como una).

Si bien es posible falsificar algunos OOP en C, por ejemplo, definiendo funciones que toman un puntero a una estructura como su primer parámetro u ocasionalmente forzando estructuras con los mismos primeros campos para ser "sub / superclases", siempre es una especie de atornillado, y no es realmente parte del lenguaje.