Utiliser des membres de classe private ou protected en C++
-
Utiliser la propriété
private
pour désigner les membres de la classe inaccessibles aux utilisateurs de la classe en C++ -
Utiliser la propriété
protected
pour indiquer les membres de la classe accessibles aux fonctions de membre de la classe dérivée ou de la classe amie
Cet article présente plusieurs méthodes pour utiliser correctement les membres de la classe private
par rapport à ceux de la classe protected
en C++.
Utiliser la propriété private
pour désigner les membres de la classe inaccessibles aux utilisateurs de la classe en C++
Le mot-clé private
est l’une des parties fondamentales du langage C++ pour implémenter les fonctionnalités d’encapsulation. Le but principal de l’encapsulation est de créer une interface renforcée pour les utilisateurs de la classe et de restreindre l’accès direct à certains membres seulement. Notez que la définition de l’interface de la classe implique que l’utilisateur de la classe n’a pas besoin de modifier ou d’accéder directement aux données des membres, mais plutôt d’appeler des méthodes publiques qui sont conçues pour effectuer ces opérations sur les objets donnés.
Il y a généralement trois mots-clés pour le contrôle d’accès : public
, private
et protected
. Les membres définis après la propriété public
sont accessibles à tous les utilisateurs de la classe. D’autre part, le spécificateur private
définit les membres qui ne peuvent être accessibles que par les fonctions membres de la classe. Dans l’exemple suivant, le code de la fonction main
peut déclarer une variable de type CustomString
, mais pour accéder à son membre str
, le code doit appeler la méthode getString
, définie comme propriété public
.
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
class CustomString {
public:
CustomString() = default;
explicit CustomString(const string& s) : str(s) { num = s.size(); }
virtual ~CustomString() = default;
string& getString() { return str; };
private:
string str;
protected:
int num{};
};
int main() {
CustomString str1("Hello There 1");
cout << "str1: " << str1.getString() << endl;
exit(EXIT_SUCCESS);
}
Production :
str1: Hello There 1
Utiliser la propriété protected
pour indiquer les membres de la classe accessibles aux fonctions de membre de la classe dérivée ou de la classe amie
Un autre mot clé disponible pour le contrôle d’accès est une propriété protected
qui rend les membres déclarés après accessibles aux fonctions de membre de classe, aux membres de classe dérivés et même aux classes d’amis. Notez que les deux derniers ne peuvent pas accéder aux membres protected
directement depuis l’objet de classe de base mais plutôt depuis l’objet de classe dérivé. L’exemple suivant montre la classe CustomSentence
qui dérive de la CustomString
, mais le membre num
de cette dernière classe est un membre protected
. Il n’est donc pas possible d’y accéder à partir de l’objet CustomString
. En d’autres termes, la fonction getSize
ne fait pas partie de la classe CustomString
, et seuls les objets CustomSentence
peuvent récupérer la valeur num
en appelant la méthode.
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
class CustomString {
public:
CustomString() = default;
explicit CustomString(const string& s) : str(s) { num = s.size(); }
virtual ~CustomString() = default;
string& getString() { return str; };
private:
string str;
protected:
int num{};
};
class CustomSentence : public CustomString {
public:
CustomSentence() = default;
explicit CustomSentence(const string& s) : sent(s) { num = s.size(); }
~CustomSentence() override = default;
int getSize() const { return num; };
string& getSentence() { return sent; };
private:
string sent;
};
int main() {
CustomString str1("Hello There 1");
CustomSentence sent1("Hello There 2");
cout << "str1: " << str1.getString() << endl;
cout << "sent1: " << sent1.getSentence() << endl;
cout << "size: " << sent1.getSize() << endl;
exit(EXIT_SUCCESS);
}
Production :
str1: Hello There 1
sent1: Hello There 2
size: 13
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