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é.
Défi
FacileConstruisons 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 classeEmployeequi 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>"
- Public : Le
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
Employeeavec 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
- Créez un
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;
}
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
1Fondamentaux de la POO
Fichiers externesBuild et Compilation C++Fichiers d'en-tête et Fichiers sourceEspaces de noms et PortéeIntroduction à la POO en C++Classes vs ObjetsLe pointeur 'this'Méthodes (Fonctions membres)Attributs (Membres de données)Bases des Ctors et DtorsRécapitulatif - Calculatrice simple4Propriétés de classe
Membres d'instance vs membres statiquesGetters et SettersFonctions membres constMot-clé mutableMéthodes et variables statiquesFonctions et classes amiesRécapitulatif - Gestionnaire de compte bancaire7Héritage
Héritage de baseNiveaux d'accès à l'héritageOrdre d'appel des Ctor et DtorRedéfinition de méthodesFonctions virtuelles et VTableHéritage multipleHéritage virtuelRécapitulatif - Hiérarchie des employés10Présentation de la STL
Présentation et philosophie de la STLConteneurs de la STLItérateursAlgorithmes de la STLFoncteurs et expressions lambdaRécapitulatif - Fréquence des mots13Patrons de conception, Partie 1
Introduction aux patrons de conceptionPatron SingletonFabrique & Fabrique abstraitePatron MonteurPatron ObservateurPatron Stratégie2Gestion de la mémoire
Mémoire Pile vs TasPointeurs et RéférencesMémoire dynamique (new/delete)Smart Pointers en C++RAII en C++Récapitulatif - Gestionnaire de tableaux dynamiques5Encapsulation
Spécificateurs d'accès en C++Spécificateurs d'accès en profondeurMasquage d'informationStruct vs ClassClasses imbriquées et internesRécapitulatif - Système de gestion d'étudiants8Polymorphisme
Polymorphisme : Compilation vs ExécutionSurcharge de fonctionsRetour sur les fonctions virtuellesFonctions virtuelles puresClasses abstraitesConception d'interfaces en C++Dynamic Casting & RTTIRécapitulatif - Calculateur de formes11Concepts avancés de la POO
Composition vs HéritageMixins via CRTPIdiome PimplEffacement de typeEnum Classes & Typage fortGestion des exceptions en POOHiérarchies d'exceptions personnalisées14Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositeRAII en tant que patron3Constructeurs et Destructeurs
Constructeur par défautConstructeur paramétréConstructeur de copieConstructeur de déplacementListes d'initialisation du constructeurConstructeurs déléguésAnalyse approfondie du destructeurRègle de trois / cinq / zéroRécapitulatif - Classe String6Surcharge d'opérateurs
Introduction à la surcharge d'opérateursSurcharge des opérateurs arithmétiquesSurcharge des opérateurs de comparaisonOpérateurs de fluxSurcharge de l'opérateur d'affectationSurcharge des opérateurs [] et ()Opérateurs de conversion de typeRécapitulatif - Classe Matrix9Templates
Templates de fonctionsTemplates de classesSpécialisation de templatesTemplates variadiquesBases de SFINAE & Type TraitsRécapitulatif - Conteneur générique