Utiliser des membres de classe private ou protected en C++

  1. Utiliser la propriété private pour désigner les membres de la classe inaccessibles aux utilisateurs de la classe en C++
  2. 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::vector; using std::string;

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::vector; using std::string;

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

Article connexe - C++ Class

  • Définir le destructeur de classe en utilisant l'opérateur Tilde en C++