Programmation Orienté Objet en C++ Ricard julien
Programmation Orienté Objet en C++ 2 Organisation Cours : Rappels Surchage de fonctions Surcharge des opérateurs Fonctions amies Fonction Template Fonction inline TP : nombres rationnels
Programmation Orienté Objet en C++ 3 Rappel If If ( condition ) { bloc si oui } else { bloc si non } ((condition)? Instruction_oui : instruction_non); While While ( condition ) { bloc executer tant que... } For For ( initialisation ; condition ; incrementation ) { bloc } Do while Do { bloc } while ( condition ) ;
Programmation Orienté Objet en C++ 4 Conditions booléenne Et : & ou && Ou : | ou || Égalité : ==, =, >, != Penser aux () et aux commentaires… (((a =0))||((a>b)&&(a<100000))) &TrueFalse True False ||TrueFalse True FalseTrueFalse
Programmation Orienté Objet en C++ 5 Classe class Date { public : int var1; Date(); ~Date(); void initialiser(int j,int m,int a); void afficher(); int getJour(); int getMois(); int getAnnee(); setJour( int j); setMois(int m); setAnnee(int a); protected: int _jour; int _mois; int _année; void _test(); private: }; Date::Date(){ _jour=0; _mois_0; _annee=0; } Date::~Date(){} void Data::afficher(){ cout << "la date : " << _jour ; cout << "/" << _mois ; cout << "/" << _annee << endl; } int Data::getJour() {return _jours;} int Data::getMois() {return _mois;}; int Data::getAnnee(){return _annee;} Data::setJour(int j) {_jour =j;} Data::setMois(int m) {_mois =m;} Data::setAnnee(int a){_annee=a;}
Programmation Orienté Objet en C++ 6 Réutilisabilité des fonctions Un bon module doit pouvoir : Manipuler plusieurs types différentes S’adapter au différentes structures de données Offrir des opérations sans connaître l’implémentation factoriser les opérations communes à un groupe de module Deux concepts La surcharge La généricité Définition de nouvelles techniques: Surchage des fonctions et des opérateurs Fonction Template
Programmation Orienté Objet en C++ 7 Surcharge Attribuer le même noms à plusieurs opèrateurs ou à plusieurs fonctions L’ambiguité est levé par le contexte : Nombre de parametres Type des parametres int max(int a,int b,int c); int max(int a,int b); float max(float a, float b, float c); float max(float a, float b); char max(char a, char b, char c); char max(char a, char b);
Programmation Orienté Objet en C++ 8 Class Point{ Public: Point(); Point(int x,int y); Private: int _x; int _y; } Exemple de surcharge de fonctions int max(int a,int b){ return ((a>b)? a : b); } float max(float a, float b){ return ((a>b)? a : b); } char max(char a, char b){ return ((a>b)? a : b); } int max(int a, int b, int c){ if ((a>b)&&(a>c)) return a; if ((b>a)&&(b>c)) return b; if((c>a)&&(c>b)) return c; } float max(float a, float b, float c){ return max(max(a,b),c); }
Programmation Orienté Objet en C++ 9 Surcharge des opérateurs On peut surcharger les opérateurs : +,-, *, /, ++, =, ==, >, <, %, +=, - = … Cela permet : SI A et B deux objets A+B; A-B; -A; If( B==A)… A=B; A+=B; … Point A,B,C; C=A+B; C=A-B; B=-A; C=-(A*B); if(A<B) C=B; else C=A;
Programmation Orienté Objet en C++ 10 Comment on fait ? Point addition(Point& A,Point& B){ Point C; C._x=A._x+B._x; C._y=A._y+B._y; return C; } Operateur + : A + B C class Point{ public: Point addition(Point& B){ Point C; C._x=_x+B._x; C._y=_y+B._y; return C; } private: int _x; int _y; }; class Point{ public: Point operator+(const Point& p){ Point N; N._x=_x+p._x; N._y=_y+p._y; return N; } private: int _x; int _y; }; Int main() Point A,B,C; C=A+B; // C=A.operator+(B); }
Programmation Orienté Objet en C++ 11 Surcharge d’opérateurs class Vecteur{ public: int& operator[](int indice); operator=(Vecteur& V); private: int taille; int *tab; }; int& Vecteur::operator[](int indice){ return tab[indice]; } Vecteur::operator=(Vecteur& V){ delete [] tab; taille=V.taille; tab= new int [taille]; for(int i;i<taille;i++) tab[i]=V.tab[i]; }cc
Programmation Orienté Objet en C++ 12 Opérateur défini hors des classes Syntaxe opérationnel A+B Syntaxe fonctionnel A.operator+(B) Si A n’est pas un objet ? Exemple : 12*B A*12 Vecteur operator*(Vecteur& v,int nombre); Vecteur operator*(int nombre, Vecteur& v); Vecteur V(1,3); 12*V; // --> operator+(12,V);
Programmation Orienté Objet en C++ 13 Fonctions amies Donne l’acces aux membres privés et protegés à : Une méthodes d’une autre classe Toute les méthodes d’une autre classe Une fonction Class A { friend void B::Ajouter(int); friend class B; friend A& operator*(int, A&); Private: int A; }
Programmation Orienté Objet en C++ 14 Surcharge de << Surcharge l’operateur << Affiche directement un objet complexe #include ’’iostream’’ ostream& operator<<(ostream& flot, Vecteur* V){ flot << V._x, << ’’ ’’ << V._y << endl; return flot ; } int main(){ Vecteur V(1,3); cout << V; return 0; }
Programmation Orienté Objet en C++ 15 Fonctions Template Générisité Fonctions Template cad générique Défini un patron de fonction Remplacé lors de la compilation int min(int a,int b){ return ((a<b)? a : b); } float min(float a, float b){ return ((a<b)? a : b); } char min(char a, char b){ return ((a<b)? a : b); } template T min ( T a, T b){ return ((a<b)? a : b ); } int main(int argc,char* argv[]){ cout << min( 12, 3)<< endl; cout << min( 12.4, 3.3)<< endl; cout << min('c', 'a')<< endl; cout << min( 12, )<< endl; return 0; }
Programmation Orienté Objet en C++ 16 Exemple de template Template acceptant plusieur types de données Définition dans le fichier interface.H template T1 min ( T2 a, T3 b){ return ((a<b)? a : b ); } int main(int argc,char* argv[]){ cout << min( 12, )<< endl; cout << min( 12.4, ‘c’ )<< endl; return 0; }
Programmation Orienté Objet en C++ 17 Fonctions inline Fonctions sont couteuses en temps Fonction inline Fonction expansée à son point d’appel Ce n’est qu’un recommendation Définition dans le fichier interface.H inline min (int a, int b){ return ((a<b)? a : b ); } int main(int argc,char* argv[]){ cout << min( 12, 3) << endl; return 0; }
Programmation Orienté Objet en C++ 18 Valeur par défaut des parametres Définition dans.H int fonction(int a= 2, int b=4, int c=5, int d=10000); int fontion(int a,int b, int c){ … return 0; } int main(int argc,char* argv[]){ fonction(2,3,5 9000); fonction(2,3,5); fonction(2,3); fonction(2); fonction(); return 0; }