Menu
Coddy logo textTech

Spécificateurs d'accès en C++

Fait partie de la section Programmation Orientée Objet du Journey C++ de Coddy — leçon 34 sur 104.

C++ fournit trois spécificateurs d'accès qui contrôlent qui peut accéder aux membres de la classe : public, protected et private. Ceux-ci constituent le fondement de l'encapsulation.

class Account {
public:
    std::string ownerName;      // Accessible de n'importe où
    
protected:
    double interestRate;        // Accessible dans cette classe et les classes dérivées
    
private:
    double balance;             // Accessible uniquement au sein de cette classe
};

Les membres publics sont accessibles de n'importe où - à l'intérieur de la classe, depuis les classes dérivées et depuis le code externe. Les membres privés sont les plus restrictifs, accessibles uniquement au sein de la classe elle-même. Protégé se situe entre les deux - il agit comme privé pour le monde extérieur, mais les classes dérivées peuvent accéder à ces membres.

class Account {
private:
    double balance;
    
public:
    Account() : balance(0) {}
    
    void deposit(double amount) {
        balance += amount;    // OK - à l'intérieur de la classe
    }
};

int main() {
    Account acc;
    acc.deposit(100);         // OK - deposit est public
    // acc.balance = 500;     // ERREUR - balance est privé
}

Par défaut, tous les membres d'une classe sont privés si aucun spécificateur n'est fourni. Cela vous encourage à décider explicitement de ce qui doit être exposé. La pratique générale consiste à rendre les membres de données privés et à fournir des méthodes publiques pour interagir avec eux en toute sécurité.

challenge icon

Défi

Facile

Construisons un système simple de gestion des employés qui démontre comment les spécificateurs d'accès contrôlent qui peut accéder à quoi. Vous allez créer une classe où certaines données sont complètement privées, d'autres sont accessibles aux sous-classes potentielles, et d'autres sont ouvertes à tous.

Vous allez créer deux fichiers pour organiser votre code :

  • Employee.h : Définissez une classe Employee qui utilise les trois spécificateurs d'accès pour protéger les données de manière appropriée :
    • Public : Le name (string) de l'employé — celui-ci peut être accédé de n'importe où
    • Protected : Le department (string) de l'employé — accessible au sein de la classe et par les classes dérivées, mais pas de l'extérieur
    • Private : Le salary (double) de l'employé — uniquement accessible au sein de la classe elle-même
    • Un constructeur qui prend le nom, le département et le salaire pour initialiser les trois membres
    • Une méthode publique getSalary() qui retourne la valeur privée du salaire
    • Une méthode publique getDepartment() qui retourne la valeur protégée du département
    • Une méthode publique giveRaise(double amount) qui augmente le salaire du montant donné (uniquement si le montant est positif)
    • Une méthode publique displayInfo() qui affiche les informations de l'employé au format : "Name: <name>, Department: <department>, Salary: "Name: <name>, Department: <department>, Salary: $<salary>"lt;salary>"
  • main.cpp : Démontrez le fonctionnement des spécificateurs d'accès en interagissant avec un objet Employee. Lisez le nom, le département et le salaire d'un employé à partir de l'entrée (trois lignes distinctes), puis :
    • Créez un Employee avec les valeurs saisies
    • Affichez le nom de l'employé directement en accédant au membre public : "Direct access - Name: <name>"
    • Affichez le département en utilisant le getter : "Via getter - Department: <department>"
    • Affichez le salaire en utilisant le getter : "Via getter - Salary: "Via getter - Salary: $<salary>"lt;salary>"
    • Accordez à l'employé une augmentation de 5000.0
    • Affichez "After raise:"
    • Appelez displayInfo() pour afficher les informations mises à jour

Formatez toutes les valeurs de salaire avec deux décimales en utilisant std::fixed et std::setprecision(2) de <iomanip>. Convertissez l'entrée du salaire de string en double en utilisant std::stod().

L'idée clé ici est que, bien que vous puissiez accéder à name directement depuis main, vous ne pouvez pas accéder directement à department ou salary — vous devez utiliser les méthodes getter publiques. C'est l'encapsulation en action : la classe contrôle comment ses données sont consultées et modifiées.

Aide-mémoire

Le C++ propose trois spécificateurs d'accès pour contrôler l'accès aux membres de la classe :

  • public : Accessible de n'importe où
  • protected : Accessible au sein de la classe et des classes dérivées
  • private : Accessible uniquement au sein de la classe elle-même
class Account {
public:
    std::string ownerName;      // Accessible de n'importe où
    
protected:
    double interestRate;        // Accessible dans cette classe et les classes dérivées
    
private:
    double balance;             // Accessible uniquement au sein de cette classe
};

Par défaut, tous les membres d'une classe sont private si aucun spécificateur n'est fourni.

Exemple illustrant le contrôle d'accès :

class Account {
private:
    double balance;
    
public:
    Account() : balance(0) {}
    
    void deposit(double amount) {
        balance += amount;    // OK - à l'intérieur de la classe
    }
};

int main() {
    Account acc;
    acc.deposit(100);         // OK - deposit est public
    // acc.balance = 500;     // ERREUR - balance est privé
}

Bonne pratique : rendez les membres de données privés et fournissez des méthodes publiques pour interagir avec eux en toute sécurité.

Essayez vous-même

#include <iostream>
#include <string>
#include <iomanip>
#include "Employee.h"

using namespace std;

int main() {
    // Lire l'entrée
    string name;
    string department;
    string salaryStr;
    
    getline(cin, name);
    getline(cin, department);
    getline(cin, salaryStr);
    double salary = stod(salaryStr);
    
    // Définir la précision pour l'affichage du salaire
    cout << fixed << setprecision(2);
    
    // TODO: Créer un objet Employee avec les valeurs d'entrée
    
    // TODO: Afficher le nom de l'employé en accédant directement au membre public
    // Format: "Direct access - Name: <name>"
    
    // TODO: Afficher le département en utilisant la méthode getter
    // Format: "Via getter - Department: <department>"
    
    // TODO: Afficher le salaire en utilisant la méthode getter
    // Format: "Via getter - Salary: $<salary>"
    
    // TODO: Accorder à l'employé une augmentation de 5000.0
    
    // TODO: Afficher "After raise:"
    
    // TODO: Appeler displayInfo() pour afficher les informations mises à jour
    
    return 0;
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet