Professional Documents
Culture Documents
Plan du chapitre :
I. Autorfrence : (oprateur this) .... 44 II. Membres constants ... 45 III.Membres statiques .... 47 IV. Les fonctions amies ...
50
Objectifs du chapitre :
Manipuler loprateur this. Manipuler les membres (attributs et mtodes) constants et celle statiques lintrieur dune classe. Comprendre la notion damiti et son utilisation dans le langage C++.
44
44
Point extremite; //Objet membre int epaisseur; const int numeroDeSerie; // membre constant public: Segment(int ox,int oy,int ex,int ey,int ep,int num): origine(ox,oy),extremite(ex,ey) { epaisseur=ep; } };
Commentaires: Le compilateur oblige dcrire au moins un constructeur. Le constructeur explicite doit initialiser lattribut constant.
Point extremite; //Objet membre int epaisseur; const int numeroDeSerie; // membre constant public: Segment(int ox,int oy,int ex,int ey,int ep,int num): origine(ox,oy),extremite(ex,ey),numeroDeSerie(num ) { epaisseur=ep; }
44
};
44
Le fait de spcifier que la fonction afficher est constante a deux consquence : Elle est utilisable pour un objet dclar constant.
Les instructions figurant dans sa dfinition ne doivent pas modifier la valeur des membres de lobjet point :
class Point{ public: int x,y ; void afficher() const { x++ ;//erreur ca affiche est constante } }
Remarque :
Il est possible de surdfinir une fonction membre en se fondant sur la prsence ou labsence du qualificatif const. Ainsi dans la classe point prcdente nous pouvons dfinir ces deux fonctions :
void afficher() const ; //afficher I void afficher() ; //afficher II
44
linstruction a.afficher() appellera la fonction II alors que c.afficher() appellera la fonction I. Pour pouvoir dclarer un objet constant, il faut tre sur que le concepteur de la classe correspondante a t exhaustif dans le recensement des fonctions membre constantes. Dans le cas contraire, on risque de ne plus pouvoir appliquer certaines fonctionnalits un tel objet constant.
III.Membres statiques:
Normalement, chaque objet dune classe possde son propre exemplaire de chaque membre ordinaire (nous dirons membre non statique) : - Pour les attributs membres cela signifie que la mmoire nouvelle est alloue lors de la cration de chaque objet. - Pour les fonctions membres, cela veut dire quelles ne peuvent tre appeles quen association avec une instance de la classe.
conduit a une situation que lon peut schmatiser ainsi : a.n a.x b.n b.x
Objet a Objet b Pour un attribut statique, si nous dfinissons une classe exple2 par :
class exple2
44
la dclaration:
exple2 a, b ;
conduit une situation que lon peut schmatiser ainsi : a.n a.x Objet a Objet b On peut dire que les membres donnes statiques sont des sortes de variables globales dont la porte est limite la classe. Initialisation des membres statiques : Un membre statique doit tre initialis explicitement lextrieur de la dclaration de la classe par une instruction telle que :
int exple2::n=5;
b.n b.x
Cette dmarche est utilisable ainsi bien pour les membres statiques privs que public. Par ailleurs, contrairement ce qui se produit pour une variable ordinaire, un membre statique nest pas initialis par dfaut zro.
class MonPoint { public: MonPoint(int px, int py); static nombreDePoints; private: int x; int y; };
44
#include "MonPoint.h" //initialization du membre statique int MonPoint::nombreDePoints= 20; MonPoint::MonPoint(int px, int py) { x=px; y=py; } #include <iostream> using namespace std ; #include "MonPoint.h" void main() { MonPoint *p=new MonPoint(1,2); MonPoint *q=new MonPoint(14,72); int nbstatic=MonPoint::nombreDePoints; cout <<"Nombre de points statiques :"<<nbstatic; cout <<"Nombre de points pour p:"<<p->nombreDePoints; cout <<"Nombre de points pour q:"<<q->nombreDePoints; //Changement du nombre de points statiques MonPoint::nombreDePoints=10; cout <<"nombre de points pour p:"<<p->nombreDePoints; cout <<"Nombre de points pour q:"<<q->nombreDePoints; }
Commentaires : Linitialisation du membre statique nombreDePoints ne peut pas se faire dans le fichier MonPoint.H mains dans un fichier .CPP Vrifier que toute instance de la mme classe dclare p et q donne la mme valeur. Aprs son changement MonPoint::nombreDePoints=10;dans la fonction main() 44
44
cout<<"Nombre de points:"<<Point ::getnbrPoints(); MonPoint P1(1,2); cout<<"Nombre de points:"<<Point ::getnbrPoints(); MonPoint P2(14,72); cout<<"Nombre de points:"<<Point ::getnbrPoints(); }
Nous voulons introduire une fonction coincide non membre de la classe permettant de 44
vrifier la concidence de deux objets de type point. Il sagit dune fonction amie, do il faut introduire tout dabord dans la classe point la dclaration damiti approprie :
class Point { int x; int y; public : Point(int,int); void afficher() ; friend bool coincide (point, point) ; }; bool coincide (point p, point q) { if(p.x==q.x&& p.y==q.y) return true; else return false; } void main() { Point P1(1,1), P2(2,2); if(coincide(P1,P2)) cout<<P1 coincide avec P2<<endl; else cout<<"P1 et P2 sont diffrents"<endl ; //... }
Remarques: Lemplacement de la dclaration damiti au sein de la classe point est absolument indiffrent. Il nest pas ncessaire de dclarer la fonction amie dans la fonction ou dans le fichier 44
source ou lon utilise, car elle est dj obligatoirement dclar e dans la classe concerne. Une fonction indpendante peut tre amie de plusieurs classes.
class B { ...... int f(float..., A ...) ; { //on a accs ici aux membres privs de tout //objet de type A } ...... };
IV.3. Toutes les fonctions membres dune classe, amie dune autre classe :
Cest une gnralisation du cas prcdent. On pourrait dailleurs effectuer autant de dclarations damiti quil ny a de fonctions concernes. Mais il est plus simple deffectuer une dclaration globale. Ainsi pour dire que toutes les fonctions membres de la classe B sont amies de la classe A, on placera, dans la classe A, la dclaration :
friend class B ;
44
class B { ......
//on a accs totale aux membres privs de tout //objet de type A ...... };
44