Cours langage C avancé-
Initiation langage C++
Préparé et présenté par Dr. Lakhrouit jihane
Professeur à l’université Moulay Ismail.
Docteur en Architecture d’entreprise (ENSIAS)
Ingénieur d’ Etat en Génie Logiciel (ENSA
Marrakech)
Encapsulation
2
21/11/2024
Encapsulation
L'encapsulation est le principe qui permet de
regrouper les attributs et méthodes au sein
d'une classe.
Cette notion est aussi associée au dispositif de
protection qui permet de contrôler la visibilité
d'un attribut ou d'une méthode. En d'autres
termes, cela signifie que chaque fois que vous
définissez un membre d'une classe ( attribut
ou méthode ), vous devez indiquer les droits
d'accès quant à l'utilisation de ce membre.
3
21/11/2024
Encapsulation
Ce mécanisme d'encapsulation permet surtout
de protéger l'objet de toute modification externe
Non acceptée. Pour cela, la plupart du temps, il
faut interdire l'accès direct aux attributs et passer
systématiquement par les méthodes.
Par exemple : si l'on désire changer la couleur
d'une voiture, il est nécessaire de passer par une
méthode de modification, et dans ce cas de
figure l'attribut couleur ne doit pas être accessible
directement.
4
21/11/2024
Encapsulation
Comme nous venons de l'évoquer, le
changement d'état d'un objet passe
nécessairement par la méthode associée.
Cela n'a aucun sens de vouloir atteindre
directement un attribut.
Il existe trois niveaux de protection :
Public
Private
Protected
5
21/11/2024
Encapsulation : Public
Tous les attributs ou méthodes d'une classe définies avec le
mot clé public sont utilisables par tous les objets. Il s'agit du
niveau le plus bas de protection. Ce type de protection est
employé pour indiquer que vous pouvez utiliser sans
contrainte les attributs et les méthodes d'une classe.
6
Encapsulation : Public
Les membres déclarés comme public sont accessibles depuis n'importe quel
endroit dans le programme, que ce soit à l'intérieur ou à l'extérieur de la classe.
Utilisé pour les fonctionnalités que l'on veut rendre accessibles à l'utilisateur de la
classe.
7
21/11/2024
Encapsulation : Private
Tous les membres d'une classe définis avec le mot clé
private sont utilisables uniquement par les méthodes de la
classe. Cette étiquette de protection constitue le niveau le
plus fort de protection. Généralement les attributs doivent
être déclarés comme privées.
8
Encapsulation : Private
Les membres déclarés comme private sont accessibles uniquement à l'intérieur de la classe où ils
sont définis.
Ils ne sont pas accessibles directement depuis l'extérieur (même pas depuis des classes dérivées).
Utilisé pour protéger des données internes ou des détails d'implémentation.
9
21/11/2024
Encapsulation : Protected
Tous les membres d'une classe définis avec le mot clé protected
sont utilisables uniquement par les méthodes de la classe et par les
méthodes des classes dérivées (par les enfants). Cette technique de
protection est fortement associée à la notion d'héritage (voir
ultérieurement).
10
Encapsulation : Protected
Les membres déclarés comme protected sont similaires à private, sauf
qu'ils sont accessibles dans les classes dérivées (héritage).
Utile pour permettre à une classe dérivée de travailler avec certains
membres de la classe de base tout en empêchant leur accès direct de
l'extérieur.
11
21/11/2024
Encapsulation
un programme classique. Dans l’exemple
suivant,
// scope programme
// scope de la classe
void f()
class foo {
{
private :
foo x;
int i;
// x.i = 9; // Erreur
public :
x.g(); // Ok
void g() {i = 3;};
}
}
12
21/11/2024
Encapsulation
13
21/11/2024
La méthode get()
Une méthode qui permet de retourner un attribut de la
classe. Exemple :
class Voiture
{
long Matr;
public :
long getMatr(){return Matr;}
}
14
21/11/2024
La méthode set()
Une méthode qui permet la modification d’un attribut de la
classe. Exemple :
class Voiture
{
long Matr;
public :
void setMatr(long M){Matr = M;}
}
15
21/11/2024
Les méthodes geters() et seters()
Exemple :
16
21/11/2024
Encapsulation
Tous les membres d'une classe doivent être au moins
déclarés à l'intérieur de la formule class nom{...} qui
constitue la déclaration de la classe.
Cependant, dans le cas des fonctions, aussi bien publiques
que privées, on peut se limiter à n‘écrire que leur en-tête à
l'intérieur de la classe et définir le corps ailleurs, plus loin
dans le même fichier ou bien dans un autre fichier.
17
21/11/2024
Encapsulation
Il faut alors un moyen pour indiquer qu'une définition de
fonction, écrite en dehors de toute classe, est en réalité la
définition d'une fonction membre d'une classe. Ce moyen
est l'opérateur de résolution de portée, dont la syntaxe est :
TypeRetour NomDeClasse::NomFonction (……)
18
21/11/2024
Encapsulation
class Point {
int x;
int y;
Par exemple, voici notre classe public:
...
Point avec la fonction distance double distance(Point
définie séparément : autrePoint);
...
}
Il faut alors, plus loin dans le double Point::distance(Point
autrePoint)
même fichier ou bien dans un {
autre fichier, donner la int dx = x - autrePoint.x;
int dy = y - autrePoint.y;
définition de la fonction promise return sqrt(pow(dx,2)+
dans la classe Point. Cela s‘écrit pow(dy,2));
}
:
19
Encapsulation
1.Déclaration de la classe :
Dans cette partie, on
déclare la classe Personne
avec ses attributs et
méthodes. On ne fournit
pas de détails sur
l'implémentation des
méthodes dans cette
section.
20
Encapsulation
2.Définition des méthodes
en dehors de la classe : Les
méthodes sont définies
avec le nom de la classe
suivi de l'opérateur de
portée ::.
•Par exemple : void
Personne::afficher() {
... }
[Link] dans main :
Une instance de Personne
est créée, et les méthodes
sont appelées pour
interagir avec l'objet.
Ce style sépare la
déclaration et
l'implémentation, ce qui est
une bonne pratique pour
structurer le code dans des
projets plus complexes.
21
21/11/2024
Travaux Pratique (Exercice 2)
Écrire un programme qui permet d’introduire les
informations suivantes pour une voiture :
Une voiture est identifié par (Matricule et un Poids).
Les attributs doivent être privés.
Crée une méthode qui permet de modifier le
matricule d’une voiture, et une autre pour le poids.
La méthode afficher permet d’afficher les informations
de la voiture (doit être externe a la classe )
Écrire un programme principale qui gère les
traitements
22
21/11/2024
Travaux Pratique (Exercice 3)
Dans la gestion d’une banque, chaque client doit avoir un
compte bancaire, le compte bancaire est identifié par un
code et un solde.
Créer la classe Compte_B
Créer les méthodes suivants :
Consulter (); //affiche les informations du compte
Retirer(double S); //retirer une somme S
Déposer(double S); //ajoute une somme S au solde
23
Le Pointeur This
24
21/11/2024
Le Pointeur this
On a parfois besoin de désigner à l’intérieur d’une fonction
membre l’objet qui est manipulé par la méthode.
Comment le désigner cependant alors qu’il n’existe aucune
variable le représentant dans la fonction membre? Les
fonctions membres travaillent en effet directement sur les
attributs de classes : ceux qui sont atteints correspondent
alors à ceux de l’objet courant.
25
21/11/2024
Le Pointeur this
C++ apporte une solution à ce problème en introduisant le
mot-clé this qui permet à tout moment dans une fonction
membre d’accéder à un pointeur sur l’objet manipulé.
26
21/11/2024
Le Pointeur this
Exemple :
L'opérateur « this » est justement un pointeur vers l'objet sur lequel nous trava
27
21/11/2024
Le destructeur
Le mécanisme automatique d’initialisation
proposé par les constructeurs est très pratique.
Mais d’autres problèmes surviennent : à quel
moment libérer l’espace mémoire alloué pour
stocker le nom d’un article en particulier? C++
apporte également une solution à ce
problème grâce à un second mécanisme
automatique, permettant d’appliquer une
méthode particulière, appelée destructeur, au
moment de la destruction de l’objet.
28
21/11/2024
Le destructeur
Quelques remarques sur cette méthode :
il n’y a qu’un seul destructeur possible par classe ;
l’identificateur désignant le destructeur est
composé du nom de la classe préfixé par le
symbole « ˜ » (ce qui donne ainsi le nom ˜Article
pour désigner le destructeur de la classe Article) ;
les destructeurs n’acceptent aucun paramètre et
ne renvoient aucun résultat ;
les destructeurs, comme les constructeurs, ne sont
jamais explicitement appelés dans un programme.
Ils sont utilisés automatiquement et implicitement
par le compilateur au moment de la création et de
la destruction des objets
29
21/11/2024
Le destructeur
Exemple : class Point
{
private:
int x, y;
public:
Point(int a, int b);
{
x = a; y = b;
}
~Point();
…
};
30
22/11/2024
Travaux Pratique (Exercice 4)
Soit la classe Date, contenant 3 entier (jj,mm,aa).
Implémenter la classe par les méthodes suivantes :
les getters et les setters.
Les trois constructeurs, un par défaut le deuxième avec
argument et le troisième avec recopie.
la méthode affichage qui permet d’afficher la date complète.
Exemple : aa: 2011, mm=1, jj=22, l’affichage sera sous la forme
suivante: 22 janvier 2011.
NB : pour les chaines de caractères, le type string est préférable a la déclaration char*.
31
22/11/2024
Travaux Pratique (Exercice 4 Suite)
Créez la classe Technicien, possédera 6 attributs (matricule, nom,
prenom, salaire_par_heure, nombre_heures , date_embauche) de
visibilité privée.
Implémenter les getters et les setters.
Implémentez trois constructeurs, un par défaut le deuxième avec
argument et le troisième avec recopie.
Implémentez la méthode affichage qui permet d’afficher les
informations du salarié.
Implémentez la méthode CalculerSalaire().
Ajouter un destructeur contenant un messager, pour affirmer la
destruction de l’objet.
NB: utiliser la classe Date comme type pour la déclaration de la variable date_embauche
32
22/11/2024
Travaux Pratique (Exercice 5)
Créer une classe Point ayant les
informations suivantes :
X : Abscisse d’un point.
Y : Ordonnée d’un point.
Les méthodes geters et seters.
Une méthode afficher qui permet de
donner le résultat suivant :
33
21/11/2024
Travaux Pratique (Exercice 5 Suite)
Partie 2 :
Créer une classe Vecteur ayant les informations
suivantes :
A (2,3)
A : Premier point du vecteur.
B : deuxième point du vecteur.
Les méthodes geters et seters.
B (4,1)
Une méthode afficher tel que :
Une méthode norme tel que :
34