Acceder a miembros privados de una clase en C++
-
Utilice el especificador de acceso
private
para encapsular miembros de clase en C++ -
Utilice funciones
public
para recuperar miembros privados de una clase en C++
Este artículo explicará varios métodos de cómo acceder a miembros privados de una clase en C++.
Utilice el especificador de acceso private
para encapsular miembros de clase en C++
Los especificadores de acceso se emplean para implementar una característica central de la programación orientada a objetos, denominada encapsulación. Como resultado, restringimos el acceso directo a miembros de datos específicos de la clase y esencialmente construimos una interfaz para operar con los datos de la clase. C++ proporciona varias palabras clave de especificación de acceso como: public
, private
y protected
, que normalmente preceden a los miembros de la clase que necesitan ser calificados con la accesibilidad correspondiente.
Los miembros definidos después del especificador private
son accesibles solo a las funciones de miembros y no pueden ser referidos directamente desde el código que usa la clase. Una clase generalmente se construye con dos lados en mente: el diseñador de la clase y el usuario de la clase. Este último suele ser el que se ve afectado por la encapsulación. Si el programador define miembros antes del primer especificador de acceso, su accesibilidad se establece por defecto en private
cuando se usa la palabra clave class
y public
en la palabra clave struct
.
En el siguiente ejemplo, implementamos una clase llamada BaseClass
con dos miembros de datos de cadena declarados como private
, por lo que para acceder a los valores de estos miembros, el diseñador de la clase debe incluir funciones public
que los recuperen. Observe que podemos eliminar la palabra clave public
del código siguiente y seguir teniendo las funciones getUsername
y getName
como miembros public
.
Otra ventaja de la encapsulación es la flexibilidad para modificar la estructura de clases interna sin preocuparse por los problemas de compatibilidad del lado del usuario. Mientras la interfaz, por lo tanto, las funciones públicas no cambien, el usuario de la clase no necesita modificar su código.
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
class BaseClass {
public:
BaseClass() = default;
explicit BaseClass(string user, string nm)
: username(std::move(user)), name(std::move(nm)) {}
~BaseClass() = default;
string& getUsername() { return username; };
string& getName() { return name; };
private:
string username;
string name;
};
int main() {
BaseClass base("buddy", "Buddy Bean");
cout << "base -> name: " << base.getName() << endl;
cout << "base -> username: " << base.getUsername() << endl;
exit(EXIT_SUCCESS);
}
Producción :
base -> name: Buddy Bean
base -> username: buddy
Utilice funciones public
para recuperar miembros privados de una clase en C++
Los miembros private
se pueden modificar usando las funciones de la interfaz de clase, por ejemplo, la función changeUsername
toma el argumento string
del usuario de la clase y almacena su valor en el miembro private
- username
. Tenga en cuenta que también hay una palabra clave friend
que distingue otras clases y funciones a las que se les permite acceder a los miembros private
de la clase. Estas funciones pueden ser externas, no formar parte de la clase mencionada anteriormente. Sin embargo, tenga en cuenta que el uso incorrecto de especificadores de acceso probablemente resulte en errores del compilador.
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
class BaseClass {
public:
BaseClass() = default;
explicit BaseClass(string user, string nm)
: username(std::move(user)), name(std::move(nm)) {}
~BaseClass() = default;
void changeUsername(const string& s) { username.assign(s); };
string& getUsername() { return username; };
string& getName() { return name; };
private:
string username;
string name;
};
int main() {
BaseClass base("buddy", "Buddy Bean");
cout << "base -> name: " << base.getName() << endl;
cout << "base -> username: " << base.getUsername() << endl;
base.changeUsername("jolly");
cout << "base -> username: " << base.getUsername() << endl;
exit(EXIT_SUCCESS);
}
Producción :
base -> name: Buddy Bean
base -> username: buddy
base -> username: jolly
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook