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 d’une classe : public, protected et private. Ils 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 peuvent être accessibles de n’importe où — à l’intérieur de la classe, depuis les classes dérivées et depuis du code externe. Les membres privés sont les plus restrictifs et ne sont accessibles qu’au sein de la classe elle-même. Protégé se situe entre les deux — il se comporte comme privé vis-à-vis du 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; // ERROR - balance est private
}Par défaut, tous les membres d’une classe sont privés si aucun spécificateur n’est indiqué. Cela vous encourage à décider explicitement de ce qui doit être exposé. En règle générale, les membres de données sont privés et des méthodes publiques sont fournies pour interagir avec eux en toute sécurité.
Défi
FacileConstruisons un système simple de gestion des employés qui montre comment les spécificateurs d'accès contrôlent qui peut accéder à quoi. Vous allez créer une class dans laquelle certaines données sont complètement privées, certaines sont accessibles aux classes dérivées potentielles, et certaines sont ouvertes à tout le monde.
Vous allez créer deux fichiers pour organiser votre code :
Employee.h: Define une classEmployeequi utilise les trois spécificateurs d'accès afin de protéger les données de manière appropriée :- Public : le
name(chaîne de caractères) de l'employé. Celui-ci peut être accessible de anywhere - Protected : le
department(chaîne de caractères) de l'employé : accessible à l'intérieur de la class et par les classes derived, mais pas de l'extérieur - Private : le
salary(double) de l'employé : accessible uniquement à l'intérieur de la class elle-même - Un constructeur qui prend name, department et salary pour initialiser les trois members
- Un method public
getSalary()qui renvoie la valeur salary privée - Un method public
getDepartment()qui renvoie la valeur department protégée - Un method public
giveRaise(double amount)qui augmente le salary de la amount indiquée (uniquement si amount est positive) - Un method public
displayInfo()qui affiche les informations de l'employé au format :"Name: <name>, Department: <department>, Salary: $<salary>"
- Public : le
main.cpp: montrez comment fonctionnent les spécificateurs d'accès en interagissant avec un objectEmployee. Lisez le name, le department et le salary d'un employé depuis l'input (trois lignes distinctes), puis :- Créez un
Employeeavec les valeurs d'input - Affichez directement le name de l'employé en accédant au member public :
"Direct access - Name: <name>" - Affichez le department à l'aide du getter :
"Via getter - Department: <department>" - Affichez le salary à l'aide du getter :
"Via getter - Salary: $<salary>" - Give à 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 salary avec deux décimales à l'aide de std::fixed et de std::setprecision(2) de <iomanip>. Convertissez l'input de salary de string en double à l'aide de std::stod().
L'idée essentielle ici est que, bien que vous puissiez accéder directement au name depuis main, vous ne pouvez pas accéder directement au department ni au salary. Vous devez utiliser les public getter methods. C'est l'encapsulation en action : la class contrôle la manière dont ses données sont accessibles et modifiées.
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 la sortie 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 une augmentation de 5000.0 à l'employé
// 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 externesGénération et compilation en C++Fichiers d’en-tête et fichiers sourceEspaces de noms et portéeIntroduction à la POO en C++Classes et objetsLe pointeur « this »Méthodes (fonctions membres)Attributs (membres de données)Bases des constructeurs et destructeursRécapitulatif - Calculatrice simple4Propriétés de classe
Membres d’instance et statiquesAccesseurs et mutateursFonctions membres constMot-clé mutableMéthodes et variables statiquesFonctions et classes amiesRécapitulatif - Gestionnaire de compte bancaire7Héritage
Héritage de baseNiveaux d’accès de l’héritageOrdre d’appel des constructeurs et destructeursRedéfinition des méthodesFonctions virtuelles et VTableHéritage multipleHéritage virtuelRécapitulatif : hiérarchie des employés10Vue d’ensemble de la STL
Vue d’ensemble et philosophie de la STLConteneurs de la STLItérateursAlgorithmes de la STLFoncteurs et expressions lambdaRécapitulatif - fréquence des mots13Modèles de conception, partie 1
Introduction aux modèles de conceptionModèle SingletonFabrique et fabrique abstraiteModèle BuilderModèle ObserverModèle Strategy2Gestion de la mémoire
Mémoire de pile ou de tasPointeurs et référencesMémoire dynamique (new/delete)Pointeurs intelligents 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 de l’informationStruct vs classeClasses imbriquées et internesRécapitulatif - Système de gestion des dossiers étudiants8Polymorphisme
Polymorphisme à la compilation vs à l’exécutionSurcharge de fonctionsRetour sur les fonctions virtuellesFonctions virtuelles puresClasses abstraitesConception d’interfaces en C++Conversion dynamique et RTTIRécapitulatif - Calculateur de formes3Constructeurs et destructeurs
Constructeur par défautConstructeur paramétréConstructeur de copieConstructeur de déplacementListes d’initialisation des constructeursConstructeurs déléguésApprofondissement des destructeursRègle des trois / cinq / zéroRécapitulatif - Classe String6Surcharge des opérateurs
Introduction à la surcharge des 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 des templatesTemplates variadiquesBases de SFINAE et des traits de typesRécapitulatif - Conteneur génériqueEntraînez-vous par vous-même : Compilateur C++ en ligne