Accéder aux membres privés d'une classe en C++
-
Utiliser le spécificateur d’accès
private
pour encapsuler les membres de classe en C++ -
Utiliser les fonctions
public
pour récupérer les membres privés d’une classe en C++
Cet article explique plusieurs méthodes d’accès aux membres privés d’une classe en C++.
Utiliser le spécificateur d’accès private
pour encapsuler les membres de classe en C++
Les spécificateurs d’accès sont utilisés pour implémenter une fonctionnalité de base de la programmation orientée objet - appelée encapsulation. En conséquence, nous limitons l’accès direct à des données membres spécifiques de la classe et construisons essentiellement une interface pour opérer sur les données de classe. Le C++ fournit plusieurs mots-clés de spécification d’accès tels que: public
, private
et protected
, qui précèdent généralement les membres de la classe qui doivent être qualifiés avec l’accessibilité correspondante.
Les membres définis après le spécificateur private
ne sont accessibles qu’aux fonctions membres et ne peuvent pas être référencés directement à partir du code qui utilise la classe. Une classe est généralement construite avec deux côtés à l’esprit - le concepteur de la classe et l’utilisateur de la classe. Ce dernier est généralement celui qui est affecté par l’encapsulation. Si le programmeur définit des membres avant le premier spécificateur d’accès, leur accessibilité est par défaut mise à private
lorsque le mot-clé class
est utilisé, et public
sur le mot-clé struct
.
Dans l’exemple suivant, nous implémentons une classe appelée BaseClass
avec deux chaînes de données membres déclarées comme private
, donc pour accéder aux valeurs de ces membres, le concepteur de la classe doit inclure des fonctions public
qui les récupèrent. Notez que nous pouvons supprimer le mot-clé public
du code ci-dessous et avoir toujours les fonctions getUsername
et getName
comme membres public
.
Un autre avantage de l’encapsulation est la flexibilité de modifier la structure de classe interne sans se soucier des problèmes de compatibilité du côté utilisateur. Tant que l’interface, donc, les fonctions publiques ne changent pas, l’utilisateur de la classe n’a pas besoin de modifier son code.
#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);
}
Production:
base -> name: Buddy Bean
base -> username: buddy
Utiliser les fonctions public
pour récupérer les membres privés d’une classe en C++
Les membres private
peuvent être modifiés en utilisant les fonctions de l’interface de classe, par exemple la fonction changeUsername
prend l’argument string
de l’utilisateur de la classe et stocke sa valeur dans le membre private
- username
. Notez qu’il existe également un mot-clé friend
qui distingue les autres classes et fonctions autorisées à accéder aux membres private
de la classe. Ces fonctions peuvent être externes, ne faisant pas partie de la classe mentionnée ci-dessus. Attention cependant, l’utilisation incorrecte des spécificateurs d’accès entraîne très probablement des erreurs du compilateur.
#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);
}
Production:
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