Accéder aux membres privés d'une classe en C++

Jinku Hu 12 octobre 2023
  1. Utiliser le spécificateur d’accès private pour encapsuler les membres de classe en C++
  2. Utiliser les fonctions public pour récupérer les membres privés d’une classe en C++
Accéder aux 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
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Article connexe - C++ Class