Documente Academic
Documente Profesional
Documente Cultură
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
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
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
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
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.
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.
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.
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
11
12
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
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 .
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
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).
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
17
Pour une structure les donnes et les mthodes membres sont public par dfaut, alors quelles sont private par dfaut pour une classe.
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
19
20
21
22
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
24
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).
26
Appel du constructeur
- un constructeur ne peut jamais tre appel explicitement en dehors d'une instruction de dfinition d'une instance
27
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
28
29
Procdure de test : void main() { CPoint cP1; // Attention : pas de () cP1.Afficher (); }
31
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
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
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.
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
35
-- 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, ...
36
- 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)
37
38
39
CPoint cP0;
l'instance cP0
//
Construction
de
}
l'instance cP1
Plan du chapitre
Introduction Constructeurs et fonctions membres
Destructeurs
Le paramtre cach this Un pointeur sur instance Exemples Complments
41
42
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
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"; }
44
Exemple 2
Utilisation
void main() { Rectangle cR1 (12, 4); Rectangle* pRec1; pRec1 = &cR1; cR1.Afficher(/* &cR1 */); cout << " Adresse instance : pRec1 = " << pRec1 << ; }
Conclusion - chaque fois qu'une instance est cre, l'argument this est initialis avec l'adresse de l'instance
45
Plan du chapitre
Introduction Constructeurs et fonctions membres Destructeurs Le paramtre cach this Complments Le spcificateur static Classes et fonctions amies
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
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
48
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
49
50
51
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
53
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
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
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
56
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
57
Des fonctions indpendantes Des fonctions membres dune autre classe Des fonctions amies de plusieurs classes Des classes amies dautres classes.
58
class MaClasse{ Private : int i; public : friend void init(Maclasse & mc, int n) {mc.i=n;} friend void afficher(Maclasse & mc) {cout <<mc.i;} };
59
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 };
64
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
65
Exemple (suite)
Dclaration de la classe CCalcul
public: void Initialiser(int, int, int); // Longueur, Largeur, //NbRectangles int CalculerSurface(); void Afficher(); };
66
void CCalcul::Initialiser(int nL1, int nL2, int nNbRec1) { m_nR1.Initialiser(nL1, nL2); m_nNbRec = nNbRec1; }
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"; }
68
Utilisation
noter que les fonctions GetLong et GetLarg ne sont plus ncessaires en dclarant CCalcul "amie" de CRectangle
69
Chapitre 4
70