Historia de la pregunta:
La encapsulación es uno de los principios clave de OOP que apareció en C++ desde su creación. La idea es limitar el acceso al estado interno de un objeto, proporcionando solo interfaces bien diseñadas para trabajar con él. En C++, la encapsulación está formalizada a través de los niveles de visibilidad de los miembros de la clase: public, protected, private.
Problema:
Si no se utiliza la encapsulación, el estado interno de los objetos puede modificarse desde cualquier lugar del programa, lo que lleva a errores, bugs difíciles de rastrear y una disminución general de la fiabilidad. Un cierre excesivo puede dificultar el mantenimiento y uso de las clases.
Solución:
Se debe diferenciar claramente entre la interfaz de la clase (sección pública) y la implementación (privada/protegida). Utilizar métodos especiales (getters/setters) para acceder a datos importantes. Para lógica compleja, separar el mecanismo a través de clases adicionales o plantillas. Usar métodos const para garantizar la inmutabilidad del estado.
Ejemplo de código:
class Counter { private: int value; public: Counter() : value(0) {} void increment() { ++value; } int get() const { return value; } };
Características clave:
¿Se puede acceder a un miembro privado de otro objeto de la misma clase directamente dentro de un método?
Sí, dentro de los métodos de la clase se puede acceder a los miembros privados de otros objetos de la misma clase.
class Example { int val; public: void copyVal(const Example& other) { val = other.val; } // ¡No hay error! };
¿Una función amiga puede acceder a los miembros privados de la clase?
Sí, la función friend tiene acceso completo a los miembros privados/protegidos de la clase.
¿Se puede hacer un constructor privado? ¿Por qué es necesario?
Sí, los constructores privados a menudo se utilizan en singletons y métodos de fábrica para controlar la creación de instancias de la clase.
La clase BankAccount contiene una variable pública balance. Cualquier código externo puede cambiar el balance directamente, lo que lleva a errores cuya investigación es casi imposible.
Ventajas:
Desventajas:
La variable balance está oculta, solo hay métodos protegidos para modificar el balance. Las comprobaciones se implementan dentro de la clase.
Ventajas:
Desventajas: