Vous êtes sur la page 1sur 69

Universit Mohammed V-Agdal Facult des sciences Rabat

Ch3 classes et objets


DESA IT F.Guerouate

Prof. G. Fatima, EST Sal

Plan du chapitre
Introduction Structures et classes : de C C++

Vocabulaire Objet
Encapsulation des donnes Dclaration de classe Contrle d'accs Constructeurs et fonctions membres Destructeurs Le paramtre cach this Complments
2

Prof. G. Fatima, EST Sal

Introduction
Structures et classes : de C C++
- il n'existe aucune relation explicite entre les donnes (les champs) d'une structure et le code des fonctions qui manipulent ces donnes : -- les champs d'une structure sont accessibles toute expression ou fonction avec les rgles habituelles de localit ou de globalit

Prof. G. Fatima, EST Sal

C++ fournit une solution radicale ce problme le mot rserv class, permet de dfinir des classes

les classes de C++ peuvent contenir non seulement des dclarations de donnes mais aussi des dclarations et des dfinitions de fonctions qui, en principe, sont seules habilites manipuler les donnes

Prof. G. Fatima, EST Sal

Vocabulaire Objet
Ce paragraphe rappelle le vocabulaire employ en orient objet. Et il donne la correspondance entre le vocabulaire objet et le vocabulaire spcifique de C++.

Objet
Un objet est une entit, qui possde un tat et un comportement. Pour dfinir ce quest un objet, les livres donnent souvent une quation du style de : objet = tat + comportement

Prof. G. Fatima, EST Sal

Vocabulaire Objet
Classe Vue de la programmation objet, une classe est un type structur de donnes. Nous verrons quune classe C++ est le prolongement des structures C (mot-cl struct). Vue de la modlisation objet, une classe correspond un concept du domaine modlis. Une classe regroupe des objets qui ont des proprits et des comportements communs. En C++, pour une classe, on dit aussi une classe.

Prof. G. Fatima, EST Sal

Vocabulaire Objet
Instance Pour dsigner un objet de la classe, on dit aussi une instance. instance est un anglicisme qui possde une signification proche de celle de exemple en franais. On dit souvent quune instance instancie une classe. Cela signifie que linstance est un exemple de la classe. En C++, pour dsigner une instance on dit plutt un objet.

Prof. G. Fatima, EST Sal

Vocabulaire Objet
Attribut ou membre
Ltat dun objet est l ensemble des valeurs de ses attributs. Un attribut est une proprit de lobjet. En C++, on dit membre.

Mthode ou fonction membre Vue de la modlisation objet, une mthode est une opration que lon peut effectuer sur un objet. Vue de la programmation objet, une mthode est une fonction qui sapplique sur une instance de la classe. En C++, on dit fonction membre.

Prof. G. Fatima, EST Sal

Encapsulation des donnes


Tout attribut dune classe est cach dans limplmentation de la classe et il est accd par une mthode de lecture et une mthode dcriture situe dans linterface de la classe. Pour rpondre ce principe, C++ prvoit les mot-cls private et public pour dire si un attribut est visible dun programme utilisateur de la classe. En ce sens, il permet de ne pas encapsuler tous les attributs dune classe et permet de ne pas suivre le principe dencapsulation a la lettre.

Prof. G. Fatima, EST Sal

Dclaration de classe
Dfinition des fonctions : void Initialiser(point* pP, int nX1, int nY1) { pP->nX = nX1; pP->nY = nY1; } void Afficher(point stP){ printf("X = ", stP.nX); printf("Y = ", stP.nY); } Procdure de test : void main(){ point stP; Initialiser(&stP, 10, 20); Afficher(stP); }
Prof. G. Fatima, EST Sal

10

Note : On pourrait videmment initialiser stP directement dans le main : stP.X = 10; Dans cet exemple, on passe par une procdure Initialiser : - Noter le passage de l'adresse de stP

Prof. G. Fatima, EST Sal

11

? Classe, Objet (exemple)


Une classe est la description d'une famille d'objets ayant mme structure (donnes) et mme comportement (mthodes) Exemple point est une classe. Cette classe est constitue des donnes x et y et des fonctions membres (mthodes) initialise, deplace, affiche. Les donnes x et y sont dites prives. Ceci signifie que lon ne peut les manipuler quau travers des fonctions membres. On dit que le langage C++ ralise lencapsulation des donnes. a et b sont des objets de classe point, cest--dire des variables de type point. On parle aussi d instances.

Prof. G. Fatima, EST Sal

12

? Classe, Objet (exemple)


Classe Articles

9340 Ordinateur 7850 05


instance

Rfrence Dsignation PrixHT Quantit


PrixTCC(); PrixTransport(); Retirer(q); Ajouter(q);

La classe joue le rle de moule permettant de reproduire autant d objets (instance) que l application le demande
Prof. G. Fatima, EST Sal 13

donnes mthodes

5000 TV 2960 10
instance

? Classe, Objet (exemple)


Dclaration de la classe : class CPoint{ private: //dclaration des donnes int X; int Y; public://dclaration des fonctiond void Initialiser (int , int ); void Afficher(); }; Dfinition des fonctions : void CPoint::Initialiser ( int X1, int Y1) { X = X1; Y = Y1; } void CPoint:: Afficher(){ cout <<"X = " << X << endl; cout <<"Y = " << Y << endl; }
Prof. G. Fatima, EST Sal 14

? Classe, Objet (exemple)


Elle utilise l'oprateur de porte :: pour indiquer la classe laquelle appartient la mthode. Procdure de test : void main(){ CPoint cP; cP.Initialiser(10, 20); cP.Afficher(); }

Attention:
On ne peut plus accder aux donnes membres directement. Il faut passer par une fonction membre
Prof. G. Fatima, EST Sal 15

Contrle d'accs
Attributs de protection des membres d'une classe En C++, on peut contrler l'accs aux membres des structures class et aussi struct, en leur donnant un attribut public, private, protected .

Dfinition des attributs de protection


-

private : les membres placs aprs ce mot rserv ne peuvent tre atteints que par les fonctions membres dclares (ou dfinies) dans la mme structure ou classe (et aux fonctions amies : cf plus loin) public : les membres placs aprs aprs ce mot rserv peuvent tre atteints sans restriction par toutes les fonctions (membres ou non)
16

Prof. G. Fatima, EST Sal

Contrle d'accs
protected : les membres placs aprs ce mot rserv peuvent tre atteints par les fonctions membres dclares (ou dfinies) dans la mme structure ou classe et par les classes drives de cette classe (notion de famille : cf hritage).

Dans l'exemple prcdent


-

les donnes membres sont prives et donc uniquement aux fonctions membres de la classe.

accessibles

les fonctions membres sont publiques et donc appelables par toute fonction : -- membre ou non

Prof. G. Fatima, EST Sal

17

Comparaison entre structure et classe

Pour une structure les donnes et les mthodes membres sont public par dfaut, alors quelles sont private par dfaut pour une classe.

Prof. G. Fatima, EST Sal

18

Plan du chapitre
Introduction Constructeurs et fonctions membres Cration d'instance par constructeur Dclaration et dfinition d'un constructeur Appel du constructeur Constructeur et fonctions membres Constructeur par dfaut Dclaration et dfinition des fonctions membres Destructeurs Le paramtre cach this Complments

Prof. G. Fatima, EST Sal

19

Cration d'une instance par un constructeur


Diverses solutions sont possibles pour crer et initialiser une instance d'une classe 1. Crer une instance "vide" l'aide du constructeur par dfaut Puis l'initialiser avec une fonction membre Initialiser C'est la solution que nous avons dj prsente

Prof. G. Fatima, EST Sal

20

Cration d'une instance par un constructeur


2. Utiliser une fonction membre spciale appele CONSTRUCTEUR (d'instance) qui permet de crer une instance et de l'initialiser cette fonction peut tre considre comme une fonction membre -- donc elle a comme les autres un paramtre cach (le pointeur sur l'instance) elle porte le mme nom que la classe -- ce qui permet au compilateur de savoir qu'il rencontre un constructeur elle ne retourne rien mme pas void

Prof. G. Fatima, EST Sal

21

Cration d'une instance par un constructeur


Dclaration de la classe : class CPoint{ private: int X; int Y; public: CPoint (int , int ); void Afficher(); }; Dfinition des fonctions : CPoint:: CPoint(int X1, int Y1) { X = X1; Y = Y1; } void CPoint:: Afficher(){ cout <<"X = " << X << endl; cout <<"Y = " << Y << endl; }

Prof. G. Fatima, EST Sal

22

Dclaration et dfinition du constructeur


Il existe deux solutions pour dclarer et dfinir un constructeur : comme d'ailleurs pour dclarer et dfinir une fonction membre en gnral

1re solution : dclaration d'un constructeur et dfinition INTERNE c'est le cas de l'exemple prcdent : la dfinition est faite l'intrieur mme de la classe grce une fonction INLINE CPoint (int nX1, int nY1) { m_nX = nX1; m_nY = nY1; } noter que le mot rserv inline est facultatif

Prof. G. Fatima, EST Sal

24

Dclaration et dfinition du constructeur


2ime solution : dfinition EXTERNE (ou dporte) la dclaration est faite l'intrieur de la classe CPoint (int nX1, int nY1); la dfinition du constructeur est faite l'extrieur de la classe CPoint ::CPoint (int nX1, int nY1) { // classe propritaire::constructeur(Arg1, Arg2, ..) m_nX = nX1; m_nY = nY1; } noter l'oprateur :: appel Oprateur de Rsolution de Porte (ORP) : il permet de nommer la classe propritaire de la fonction dfinition externe
Prof. G. Fatima, EST Sal 25

Appel du constructeur
Que le constructeur soit dfini en interne ou en externe, l'appel est de la forme
void main { CPoint cP1(10, 20); ... } le constructeur est appel automatiquement lorsque on veut crer une instance (c'est dire en pratique lors de la dclaration de cette instance).

Prof. G. Fatima, EST Sal

26

Appel du constructeur
- un constructeur ne peut jamais tre appel explicitement en dehors d'une instruction de dfinition d'une instance

l'appel automatique du constructeur est galement effectu :


-- lors de la copie d'un objet ou -- lors d'une cration dynamique avec l'oprateur new (ce point sera trait dans le chapitre "Objets dynamiques")

Prof. G. Fatima, EST Sal

27

Constructeurs et fonctions membres


Ressemblances entre constructeurs et fonctions membres un constructeur peut comporter des arguments tout comme une fonction membre.

le corps d'un constructeur est construit comme celui d'une fonction membre : de ce fait, un constructeur peut appeler toute fonction membre de sa classe et manipuler les donnes membres de cette classe

Prof. G. Fatima, EST Sal

28

Constructeurs et fonctions membres


Diffrences entre constructeurs et fonctions membres un constructeur ne renvoie jamais de valeur (pas mme void) : cela n'aurait pas de sens puisqu'il ne peut tre appel que lors de la dclaration d'une instance. pour des raisons de performance, les constructeurs ne peuvent pas avoir l'attribut virtuel : le compilateur ne les traite pas exactement comme des fonctions membres (ce point sera trait dans le chapitre "Fonctions virtuelles").

Prof. G. Fatima, EST Sal

29

Constructeur par dfaut


Les constructeurs sont normalement dfinis par l'utilisateur : toutefois, C++ cre un constructeur minimal (sans arguments) pour les classes qui n'en possdent pas Dclaration de la classe : class CPoint{ private: int X;int Y; public: // pas de constructeur void Afficher(); // affiche X et Y };

Procdure de test : void main() { CPoint cP1; // Attention : pas de () cP1.Afficher (); }

Prof. G. Fatima, EST Sal 30

Complments sur les constructeurs


Une classe peut comporter plusieurs constructeurs la version adquate sera choisie automatiquement en fonction de la liste des arguments (ce problme sera trait dans le chapitre "Surcharge"). Attention : si dans une classe on dfinit explicitement un constructeur, le constructeur par dfaut cr par C++ ne peut plus tre utilis : -- il faut alors le recrer explicitement : CPoint () {}

Prof. G. Fatima, EST Sal

31

Complments sur les constructeurs


Valeur implicite des arguments on peut donner des valeurs implicites aux arguments d'un constructeur (tout comme une fonction membre) en indiquant ces valeurs dans la dclaration.

Exemples
-dclaration : CPoint(int nX1, int nY1 = 22); cration de l'instance : CPoint cP1(10); initialise la donne membre X 10 et Y 22 (valeur par dfaut)

--

dclaration : CPoint(int nX1 = 11, int nY1 = 22); la cration de l'instance : CPoint cP1; initialise les donnes membres X et Y avec les valeurs par dfaut
Prof. G. Fatima, EST Sal 32

Dclaration et dfinition des fonctions membres


Comme pour les constructeurs, deux solutions : 1re solution : dclaration d'une fonction et dfinition INTERNE int RetournerX() { return m_nX; } // fonction inline 2me solution : dfinition EXTERNE (ou dporte) la dclaration est faite l'intrieur de la classe int RetournerX ();

la dfinition est faite l'extrieur de la classe int CPoint::RetournerX() { // Type retourn ClassePropritaire::FonctionMembre(Arg1, Arg2, ..) return m_nX; };
Prof. G. Fatima, EST Sal 33

Dclaration et dfinition des fonctions membres


-

l'oprateur :: permet la fonction membre de rester dans la porte de la classe : -- il se peut en effet que d'autres fonctions s'appellent RetournerX.

-- assure donc que la variable m_nX dans l'instruction return m_nX est bien la variable m_nX de la classe CPoint.

Prof. G. Fatima, EST Sal

34

Plan du chapitre
Introduction Constructeurs et fonctions membres

Destructeurs
Destructeurs implicites et explicites Appel des destructeurs implicites Dclaration et dfinition d'un destructeur explicite Le paramtre cach this Complments

Prof. G. Fatima, EST Sal

35

Destructeurs implicites et explicites


- De la mme manire qu'il existe des constructeurs, il existe aussi des destructeurs -- un destructeur permet de dtruire les objets d'une classe crs au pralable par un constructeur et libre la mmoire

-- un destructeur peut aussi en complment raliser d'autres actions telles que la recopie de champs de donnes dans un fichier disque, la fermeture d'un fichier, ...

Prof. G. Fatima, EST Sal

36

Destructeurs implicites et explicites


Destructeurs implicites et explicites - si on ne dfinit pas de destructeur explicite pour une classe, C++ en gnre un automatiquement pour dtruire les donnes membres de l'objet dtruit -c'est le cas le plus frquent

- toutefois, dans certains cas, il faut dfinir des destructeurs explicites : -- lors de la cration dynamique d'objets (cf. "Objets dynamiques") -- lorsque les donnes membres sont des pointeurs, seules ces donnes sont dtruites (pas les donnes pointes)

Prof. G. Fatima, EST Sal

37

Dclaration et dfinition d'un destructeur explicite


Les destructeurs suivent peu prs les mmes rgles que les constructeurs - le nom est simplement prcd par le caractre tilda ~ - il ne renvoie aucune valeur - il n'accepte aucun argument lors de son appel : -- il ne peut donc y avoir qu'un seul destructeur par classe les dfinitions peuvent tre externes ou internes

Prof. G. Fatima, EST Sal

38

Dclaration et dfinition d'un destructeur explicite


Syntaxe des destructeurs dfinis explicitement dclaration et dfinition interne ~CPoint() { // corps du destructeur }

dclaration et dfinition externe ~CPoint(); inline CPoint::~CPoint() { // corps du destructeur }

Prof. G. Fatima, EST Sal

39

Appel automatique des destructeurs


Destruction d'une instance - une instance est dtruite par appel automatique du destructeur correspondant, la sortie du bloc dans lequel l'instance a t cre : void main() {

CPoint cP0;
l'instance cP0

//

Construction

de

{ CPoint cP1 (11, 21); { CPoint cP2 (12, 22); }


l'instance cP2 // Construction de l'instance cP1

// Construction de l'instance cP2


// Destruction automatique de // // Destruction Destruction automatique automatique de de 40

}
l'instance cP1

Prof. G. Fatima, EST Sal

Plan du chapitre
Introduction Constructeurs et fonctions membres

Destructeurs
Le paramtre cach this Un pointeur sur instance Exemples Complments

Prof. G. Fatima, EST Sal

41

Auto-rfrence : le pointeur this


Le mot rserv this dsigne un pointeur, implicitement dclar, sur l objet lui-mme (auto-rfrence) Il peut tre utilise dans n importe quelle fonction membre et constitue un alias de l objet Exemple 1 class point { int x,y public : void initialise(int , int); }; void point :: initialise(int x, int y) {this->x=x; this->y=y}

Prof. G. Fatima, EST Sal

42

Auto-rfrence : le pointeur this


Exemple 2 Dclaration d'une classe Rectangle
class Rectangle { int Long, Larg; // Dclaration implicite de this // Ce membre est un pointeur sur //une instance de la classe public: int CalculerPerim(); Rectangle(int, int); //constructeur void Afficher(); };

Dfinition du constructeur

Rectangle::Rectangle( int L1, int L2) { this -> Long = L1; // Ou bien Long = L1 this -> Larg = L2; //cout<<\n ladresse de lobjet est <<this; }
43

Prof. G. Fatima, EST Sal

Exemple 2
Dfinitions des fonctions membres

int Rectangle::CalculerPerim ( /* Rectangle *this */ ) { int Perim; Perim = 2 * (this -> Long + this -> Larg ); return Perim; } void Rectangle::Afficher ( /*Rectangle *this, */ ) { cout << " Longueur : " << this -> Long << "\n"; cout << " Largueur : " << this -> Larg << "\n"; cout << " Primtre : " << this -> CalculerPerim() << ; cout << " Adresse instance : this = " << this << "\n"; }

Prof. G. Fatima, EST Sal

44

Exemple 2
Utilisation
void main() { Rectangle cR1 (12, 4); Rectangle* pRec1; pRec1 = &cR1; cR1.Afficher(/* &cR1 */); cout << " Adresse instance : pRec1 = " << pRec1 << ; }

l'affichage donne la mme valeur d'adresse pour this et pRec1

Conclusion - chaque fois qu'une instance est cre, l'argument this est initialis avec l'adresse de l'instance

Prof. G. Fatima, EST Sal

45

Plan du chapitre
Introduction Constructeurs et fonctions membres Destructeurs Le paramtre cach this Complments Le spcificateur static Classes et fonctions amies

Prof. G. Fatima, EST Sal

46

Introduction
Membres static Donne membre : le spcificateur static permet de dfinir des membres communs plusieurs instances dune classe Fonction membre : le spcificateur static permet de dfinir une fonction normale qui n'est utilisable que par les instances de la classe o elle a t dfinie

Prof. G. Fatima, EST Sal

47

Introduction
Fonctions et classes amies (friend) lattribut friend permet une fonction ou l'ensemble des fonctions d'une classe d'accder aux membres privs et/ou protgs d'une autre classe -- Sans passer par des fonctions membres

Attention : -- Lattribut friend est interdit par la morale (contraire aux principes de lobjet) -- Cest pratique mais il ne faut pas en abuser

Prof. G. Fatima, EST Sal

48

Donnes membres "static"


Cration et initialisation une donne membre statique est cre et initialise 0 ds que la classe est dfinie et elle existe avant que des instances soient cres

Caractristiques des donnes statiques contrairement aux membres non statiques pour lesquelles il existe une copie distincte pour chaque instance de la classe, pour les membres statiques il existe une seule copie de la donne on peut considrer que les donnes membres statiques sont des variables globales qui ne sont partages que par les instances d'une classe

Prof. G. Fatima, EST Sal

49

Donnes membres "static"


Accs aux donnes statiques soient m_Sx une donne statique de la classe CX, cX1 une instance de CX on accde sans faire rfrence une instance : CX::m_Sx mais on peut aussi accder par les oprateurs d'accs normaux : cX1.m_Sx

Prof. G. Fatima, EST Sal

50

Donnes membres "static"


Accs aux donnes statiques (exemple) soient nbr_point une donne statique de la classe CPoint, a une instance de CPoint on accde sans faire rfrence une instance : CPoint::nbr_point mais on peut aussi accder par les oprateurs d'accs normaux : a.nbr_point (si la variable est public)

Prof. G. Fatima, EST Sal

51

Donnes membres "static"


Donne membre statique
class CStatic { private: static float m_fS; public: void Afficher(); };
void CStatic::Afficher() { cout << "fS = " << m_fS <<endl; } // Initialisation de la donne membre float CStatic :: m_fS = 2.2f; void main() { CStatic cS; cS.Afficher(); }
Prof. G. Fatima, EST Sal 52

Effectue en dehors des fonctions

Fonctions membres "static"


Caractristiques des fonctions membres statiques
-

Une fonction membre manipulant des donnes statiques peut tre dclare static Lappel dune telle fonction ne ncessite que la rfrence la classe Il est nanmoins autoris de faire rfrence un objet instance de la classe Le premier argument dune fonction static nest plus implicitement le pointeur this

Prof. G. Fatima, EST Sal

53

Fonctions membres "static"


Appel des fonctions membres statiques soient F une fonction statique de la classe CX, cX1 une instance de CX on appelle la fonction en faisant rfrence classe : -- cX::F(nInit); mais on peut appeler aussi la fonction membre statique en utilisant les oprateurs d'accs normaux : -- cX1.F(nInit);

Pas de pointeur this pour les fonctions statiques puisque une fonction statique peut tre appele sans faire rfrence une instance, cette fonction n'a pas de pointeur cach this
Prof. G. Fatima, EST Sal 54

Fonctions membres "static"


Fonction membre statique : class CStatic { private: float m_fS; public: void Afficher(); static void Set(CStatic& cS, float fS); }; void CStatic::Afficher() { cout << "fS = " << m_fS <<endl; } void CStatic::Set(CStatic& cS, float fS){ cS.m_fS = fS; } void main() { CStatic cS; CStatic::Set(cS, 1.1f); cS.Afficher(); } Donne et statiques : fonction membre

class CStatic { private: static float m_fS; public: void Afficher(); static void Set(float fS); }; void CStatic::Afficher() { cout << "fS = " << m_fS <<endl; } void CStatic::Set(float fS) { m_fS = fS; } float CStatic::m_fS; void main() { CStatic cS; CStatic::Set(1.1f); cS.Afficher(); }
Prof. G. Fatima, EST Sal 55

Classes et fonctions amies


Dfinition

les classes et fonctions ayant l'attribut friend (amie) : attribut permettant une fonction ou l'ensemble des fonctions d'une classe d'accder aux membres privs et/ou protgs d'une autre classe

Prof. G. Fatima, EST Sal

56

Classes et fonctions amies


Exemple d'introduction

on considre une classe CX et une classe CY en dclarant dans CX, la classe CY amie (de CX), on permet toutes les fonctions de la classe CY d'accder aux membres privs et protgs de la classe CX de la mme manire, on peut dclarer une fonction F amie (de CX),qui permet cette fonction (et seulement celle l) d'accder aux donnes prives et protges de la classe CX noter que la fonction F n'tant pas membre de CX,(elle n'est donc pas dans la porte de CX), ne peut pas tre appele avec les oprateurs d'accs normaux : -- soit cX1.F (ou pX1->F) -- cX1 et pX1 sont respectivement une instance et un pointeur sur l'instance

Prof. G. Fatima, EST Sal

57

Classes et fonctions amies


Les friend peuvent tre

Des fonctions indpendantes Des fonctions membres dune autre classe Des fonctions amies de plusieurs classes Des classes amies dautres classes.

Prof. G. Fatima, EST Sal

58

Fonctions friend indpendantes

class MaClasse{ Private : int i; public : friend void init(Maclasse & mc, int n) {mc.i=n;} friend void afficher(Maclasse & mc) {cout <<mc.i;} };

Void main() MaClasse M; init(M,15); affiche(M);

Prof. G. Fatima, EST Sal

59

Fonctions friend Membres dune autre classe


class MaClasse; class MonAutreClasse{ public : void afficher(Maclasse & ) }; class MaClasse{ Private : int i; public : Maclasse(int n=10) {this->i=n;} friend void MonAutreClasse ::afficher(Maclasse &); }; void MonAutreClasse ::afficher(Maclasse & mc) {cout<<mc.i;}

Void main() MaClasse M(20); MonAutreClasse Mautre Mautre.afficher(M);


Prof. G. Fatima, EST Sal 60

Fonctions friend de plusieurs classes


class MonAutreClasse; class MaClasse{ Private : int i; public : Maclasse(int n=10) {this->i=n;} friend void afficher(Maclasse &, MonAutreClasse &)); }; class MonAutreClasse{ Private : float x; public : MonAutreClasse(float y=10.5) {this->x=y;} friend void afficher(Maclasse &, MonAutreClasse &); }; void afficher(Maclasse & mc, MonAutrClasse &m_autre) {cout<<mc.i<<m_autre.x;} Void main() { MaClasse M(20); MonAutreClasse Mautre afficher(M, Mautre); }
Prof. G. Fatima, EST Sal 61

Classes friend Dautres classes


class MonAutreClasse; class MaClasse{ Private : int i; public : Maclasse(int n=10) {this->i=n;} friend class MonAutreClasse ; }; class MonAutreClasse{ public : void afficher(Maclasse &mc) {cout<<mc.i<<endl; };

Void main() { MaClasse M(20); MonAutreClasse Mautre Mautre(M); }


Prof. G. Fatima, EST Sal 62

Exemple
Enonc et principe d'utilisation on considre une classe CRectangle (avec ses donnes prives m_nLong et m_nLarg) et une classe CCalcul qui contient une fonction CalculerSurface permettant de calculer la surface de m_nNbRec rectangles de base cette fonction a besoin d'accder aux donnes membres prives de la classe CRectangle la classe CCalcul pourrait videmment obtenir les valeurs de m_nLong et m_nLarg, en utilisant les fonctions membres publiques GetLong et GetLarg de Rectangle toutefois, en dclarant CCalcul amie de CRectangle, la fonction CalculerSurface peut obtenir directement ces valeurs noter la dclaration pralable class CCalcul; placer avant la dclaration de la classe CRectangle qui permet au compilateur de reconnatre la classe CCalcul dclare amie plus bas
Prof. G. Fatima, EST Sal 63

Exemple (suite)
Dclaration de la classe CRectangle

class CCalcul; class CRectangle { friend CCalcul; private: int m_nLong, m_nLarg; public: void Initialiser(int, int); // int GetLong(); // Inutile // int GetLong(); // Inutile };

Prof. G. Fatima, EST Sal

64

Dfinitions des fonctions de la classe CRectangle

void CRectangle::Initialiser(int L1, int L2) {Long = L1; Larg = L2;} // int CRectangle::GetLong(void) { return Long; } // Inutile // int CRectangle::GetLarg(void) { return Larg; } // Inutile

Prof. G. Fatima, EST Sal

65

Exemple (suite)
Dclaration de la classe CCalcul

class CCalcul { private: int m_nNbRec; CRectangle m_nR1;

// Cration d'une instance de //CRectangle

public: void Initialiser(int, int, int); // Longueur, Largeur, //NbRectangles int CalculerSurface(); void Afficher(); };

Prof. G. Fatima, EST Sal

66

Dfinitions des fonctions de la classe CCalcul

void CCalcul::Initialiser(int nL1, int nL2, int nNbRec1) { m_nR1.Initialiser(nL1, nL2); m_nNbRec = nNbRec1; }

Prof. G. Fatima, EST Sal

67

Exemple (suite)
Dfinitions des fonctions de la classe CCalcul (suite)

int CCalcul::CalculerSurface() { return m_nNbRec * (m_nR1.m_nLong * m_nR1.m_nLarg); // Accs direct } void CCalcul::Afficher() { cout << " Surface totale : " << CalculerSurface() << "\n"; }

Prof. G. Fatima, EST Sal

68

Utilisation

void main () { CCalcul cC1; cC1.Initialiser(10, 5, 2); cC1.Afficher(); }

noter que les fonctions GetLong et GetLarg ne sont plus ncessaires en dclarant CCalcul "amie" de CRectangle

Prof. G. Fatima, EST Sal

69

Chapitre 4

Prof. G. Fatima, EST Sal

70