Clase y Struct
Antes de que entendamos la diferencia entre Clase y Estructura, debemos conocer algunos conceptos básicos asociados con ellos. Sin una comprensión de los conceptos, es difícil comprender las diferencias entre los dos.
¿Qué es la clase y el objeto?
Estos son los dos conceptos importantes relacionados con la Programación Orientada a Objetos, y forman la base para enmarcar las funciones y el paso de datos a otras funciones. Para una mejor comprensión, podemos correlacionarla con un ejemplo de la vida real. Una clase puede considerarse como una tienda, y un objeto puede ser cualquiera de las tiendas individuales, específicas como comestibles, papelería, fruta, etc. Todos los objetos comparten las propiedades comunes de la clase principal (la tienda) y, a su vez, los objetos pueden tener sus propias propiedades exclusivas, como un diseño específico, iluminación, etc. A través de los objetos, podemos usar la clase; forman las instancias de una clase.
Sintaxis de una clase
Tienda de clase {
cosas de cadena pública;
diseño de cadenas públicas;
}
Sintaxis de un objeto
Tienda de comestibles = nueva tienda ();
Store Stationery = new Store ();
¿Qué es un Struct?
A Struct incluye solo los datos y, por lo tanto, es útil para enmarcar los requisitos de datos individuales a través de los objetos Struct. A diferencia de una clase, carece de funciones. Aquí está su sintaxis:
struct grocery_entrance {
char entrance_name [50];
int entrance_size;
} grocery_entrance;
Todas las tiendas pueden usar la "entrada" de Struct con nombres y tamaños individuales.
¿Qué es la herencia?
Es similar a cómo un hijo hereda las posesiones de su padre y, a su vez, el hijo también puede agregar otras posesiones propias. La Clase puede ser una clase base o una clase derivada, en la que la primera puede tomarse como la base para formar la segunda. La clase derivada agrega algunas otras propiedades para sí misma aparte de lo que obtiene de la clase base. Cuando consideramos el ejemplo anterior, la tienda de comestibles aún se puede derivar a una tienda de comestibles específica, como la tienda de comestibles XYZ.
Ahora que estamos familiarizados con los conceptos básicos, podemos entrar en la diferencia real entre Clase y Struct.
¿Cómo difieren?
- Reutilización: A medida que las Clases forman el marco básico, se pueden reutilizar; Sin embargo, las estructuras son elementos individuales con propiedades específicas, por lo que no se pueden reutilizar. Por ejemplo, la clase de la tienda de comestibles se puede utilizar para cualquier tipo de tienda de comestibles, pero Struct grocery_entrance es específica para eso solo y no tiene sentido reutilizarla en otras clases.
- Visibilidad: Todas las funciones en una clase están disponibles públicamente para sus objetos. Por ejemplo, tenemos una función llamada "cosas" en la clase "tienda". La función "cosas" es visible para todos sus Objetos, como "tienda de comestibles", "papelería", etc. Esta estructura no es posible con Estructuras, ya que los datos de la estructura se restringen a sí mismos y no son visibles para otras Estructuras. Para aclarar las cosas, podemos decir que los datos de 'grocery_entrance' no son visibles públicamente para todas las demás tiendas.
- Pase por referencia y pase por valor: Pass by Reference envía solo la ubicación de la memoria y no los datos reales a las funciones. Esto significa que siempre que el valor cambie, el cambio se reflejará en las funciones correspondientes. Pasar por valor, a su vez, es simplemente enviar el valor a la función. En este caso, un cambio en el valor después de ser enviado no se reflejará en la función. La clase usa el paso por referencia, y Struct usa el valor del pase.
- Herencia: Las clases pueden heredarse aún más para formar subclases, pero Structs no puede utilizar la herencia. Por ejemplo, la Tienda de clases da sus funciones a la subclase ‘tienda de comestibles’. Pero el Struct ‘grocery_entrance’ no puede heredar ninguna función. Podemos decir que no hay ningún concepto como subestructura aquí.
- Visibilidad por defecto: Todos los miembros de una Clase se mantienen como entidades privadas por defecto, mientras que los miembros de un Struct se mantienen como entidades públicas por defecto.
- El tamaño de una clase vacía y Struct: La clase utiliza un tamaño de 1 byte incluso cuando está vacía, mientras que Struct nunca usa ninguna memoria cuando está vacía. Esto significa que podemos decir que el tamaño de una estructura vacía es igual a 0 bytes.
- Recolección de basura: La recolección de basura es posible con las clases, ya que utilizan pasar por referencia. Por lo tanto, es más fácil hacer la limpieza en un lugar donde se almacenan los datos. Por otro lado, la recolección de basura no es posible con Struct, ya que utiliza el paso por valor y los datos se encuentran dispersos en diferentes ubicaciones.
- Gestión de la memoria: Debido a que Class permite recolecciones de basura, la administración de memoria también es efectiva; Sin embargo, no es tan efectivo con Structs.
- Constructor: Un constructor generalmente inicializa la clase con ciertos valores especificados. Podemos verlo como algo que ha sido inicializado con valores. Si se debe crear una nueva clase, se llama al constructor para asignar memoria para esa instancia. Incluso podemos pasar valores como argumentos al llamar a un constructor. Vengamos a nuestra discusión actual ahora.Las clases permiten constructores de todos los tipos, como con o sin argumentos, mientras que las estructuras solo permiten a los constructores con argumentos, es decir, los constructores parametrizados.
- Incinerador de basuras: Se llama a un destructor cada vez que necesitamos eliminar una instancia de una clase. El destructor, a su vez, borra esa instancia y libera memoria. Una clase puede usar un destructor, mientras que una clase no puede.
- Inicialización de variables de miembros: En Clases, podemos inicializar las variables miembro directamente; Tal inicialización no es posible con Structs.
- Creación de objetos: La sintaxis general para la creación de objetos en clases es:
Demo obj = nueva Demo ();
Esto significa que debemos usar la palabra clave "nuevo" al crear objetos de una clase. Esto no es necesario al crear objetos de Estructuras. Basta con echar un vistazo a su sintaxis:
Demo obj;
Funciona perfectamente incluso sin la palabra clave "nuevo".
¿Cuándo usar la clase y cuándo usar Struct?
Como las Clases son más flexibles en el manejo de datos y funciones, podemos hacerlo cuando los objetos utilizados son complejos y grandes. En nuestro ejemplo, un centro comercial puede usar la clase "tienda" para expresar el sistema de una mejor manera. Sin embargo, las estructuras están restringidas a objetos más pequeños, ya que son comparativamente menos efectivas que las Clases. Por lo tanto, si diseña una tienda propia, las Estructuras son la mejor opción.
¿Cómo convertir un Struct a una clase y viceversa?
Es posible que haya escuchado los términos 'boxeo' y 'unboxing' para convertir un Struct en una clase, y viceversa. Aunque estos son procesos efectivos para ayudarnos en la conversión, deben manejarse con precaución. Como esto afecta directamente a las ubicaciones de la memoria, hay un gran impacto en el rendimiento de nuestro sistema. Además, afecta los procesos de recolección de basura y da como resultado una ineficiencia general del sistema. Por lo tanto, use estas conversiones solo cuando sea necesario.
Veamos las diferencias mencionadas anteriormente en forma tabular.
S.No | Conceptos | Diferencias | |
Clase | Struct | ||
1 | Reutilización | Completamente reutilizable | No reutilizable |
2 | Visibilidad | Todas las funciones de una clase son visibles a sus objetos. | Los datos de un objeto de una estructura no son visibles para otros objetos de la misma estructura. |
3 | Pase por referencia y pase por valor | Usos pasar por referencia | Usos pasar por valor |
4 | Herencia | Las funciones de una clase pueden ser heredadas por sus subclases; permite la herencia | Nunca permite la herencia |
5 | Visibilidad predeterminada | Todos los miembros de una clase son privados por defecto | Todos los miembros de un Struct son públicos por defecto. |
6 | Tamaño cuando está vacío | El tamaño de una clase vacía es de 1 byte. | El tamaño del Struct vacío es de 0 bytes. |
7 | Recolección de basura | Como utiliza pasar por referencia, es posible la recolección de basura. | Ya que utiliza el paso por valor, la recolección de basura no es posible |
8 | Gestión de la memoria | La facilidad del proceso de recolección de basura ayuda en la gestión efectiva de la memoria. | La falta de recolección de basura da como resultado una mala gestión de la memoria. |
9 | Constructores | Permite constructores de todo tipo, como con o sin parámetros | Solo permite constructores parametrizados. |
10 | Destructores | Puede usarlo | No se puede usar |
11 | Inicialización de variables de miembros | Permite la inicialización directa de variables miembro. | No permite la inicialización directa de palabras de las variables miembro. |
12 | Creación de objetos | Es obligatorio utilizar la palabra clave "nuevo" durante la creación del objeto. | Es opcional usar la palabra clave ‘nuevo’ durante la creación del objeto |
13 | ¿Cuándo usar? | Mejor para objetos más grandes y complejos donde se requiere herencia. | Mejor para objetos más pequeños y simples donde la herencia es de menor importancia. |
Casi hemos cubierto todas las diferencias entre Clase y Struct, y si cree que falta algo, háganoslo saber. ¡Aprendamos juntos y aprovechemos ese conocimiento!