leçon 2 : surcharge des opérateurs iup 2 génie informatique méthode et outils pour la...
TRANSCRIPT
![Page 1: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/1.jpg)
Leçon 2 : Surcharge des opérateurs
IUP 2 Génie Informatique
Méthode et Outils pour la Programmation
Françoise Greffier
Université de Franche-Comté
![Page 2: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/2.jpg)
Leçon 2:Surcharge des opérateurs
La surcharge
Intérêt de la surcharge
Règles de surcharge
Opérateurs arithmétiques (classe vecteur)
Opérateurs de redirection de flux
Fonctions et classes amies
![Page 3: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/3.jpg)
Méthode surchargée
Le langage C++ permet la surcharge des méthodes, c’est à dire qu’il offre la possibilité d’implanter des méthodes ayant le même « nom ».
La signature d ’une méthode regroupe son nom et le type de ses paramètres.
Le type retour ne fait pas partie de la signature d ’une méthode.
![Page 4: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/4.jpg)
Méthode surchargée : exemple
Exemple d ’utilisation de la méthode :
int i=power (2,3);
double z=power(3.14,4);
double z=power(2,3);
Méthode power surchargée :int power (int x, int y);double power (double x, double y);
![Page 5: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/5.jpg)
Méthode surchargée : résolution
C’est la signature de la méthode qui permet au compilateur de sélectionner quelle méthode activer parmi celles surchargées.
Les critères de sélection intervenant dans la résolution de surcharge sont :
1) La portée de la classe de l’instance qui déclenche l’appel.
2) Le nombre d’arguments dans l’appel.
3) La distance entre le type des arguments et celui des paramètres correspondant.
![Page 6: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/6.jpg)
CLASSE VECTEUR
On considère l ’objet : vecteur d ’entiers. Exemple : V = (2,5,1,4) V est un vecteur de 4 entiers.La dimension du vecteur a une valeur maximum égale à 10.
![Page 7: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/7.jpg)
Classe vecteur : interface# include <iostream.h>const int max=10;class vecteur{public :
vecteur(void); // constructeur vecteur (int t);// const et initialisation de la taille int getTaille(void); // Sélecteur => taille de IC void saisir (void); //saisie de ICvoid afficher(void);//Affichage de IC vecteur add (const vecteur&);// Est retourné : IC + argument void modifier(int i,int v); // T[i] <- v ~vecteur (void)// destructeur
private : int taille; //nombre de cases réellement occupéesint t[max]; //tableau de max entiers
};
![Page 8: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/8.jpg)
Classe vecteur : implantation
int vecteur::getTaille(void){
return taille;
}
vecteur::vecteur(void){ taille=0;
}
vecteur::vecteur (int t){ taille = t;
}
![Page 9: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/9.jpg)
Classe vecteur : implantation
void vecteur::saisir (void){
if (taille==0){
int ta;
cout << "\n Taille du vecteur :";
cin >> ta;
if (ta <= max) taille = ta; else taille=max;}
for (int i=0; i<taille;i+=1){
cout<<"\n Valeur de l'élt No "<<i+1<< " : ";
cin >> t[i]; }
}
![Page 10: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/10.jpg)
Classe vecteur : implantation
void vecteur::afficher(void){
for (int i=0; i<taille;i+=1)
{
int no=i+1;
cout <<"\n"<< no <<" : ";
cout << t[i];
}
}
![Page 11: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/11.jpg)
Classe vecteur : implantation vecteur vecteur::add (const vecteur& v){ // IC + v vecteur somme; //appel du constructeur if (this->taille == v.taille){
somme.taille=this->taille; for (int i=0; i<this->taille;i+=1){
somme.t[i]=this->t[i]+v.t[i];
} } return (somme);//appel du construct par copie
}
void vecteur::modifier(int i,int v){ t[i]=v;
}
![Page 12: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/12.jpg)
SURCHARGE des OPERATEURS
INTERÊTS :
Facilité d’écriture
Facilité de lecture
Lisibilité
BUT : Etendre la définition standard d ’un opérateur sur d’autres objets que ceux pour lesquels il est prédéfini.
cout << V1+V2
# include"vecteur.h"
void main (void)
{ vecteur V1 (6);
vecteur V2 (6);
cin >> V1>>V2;
...
![Page 13: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/13.jpg)
SURCHARGE des OPERATEURS
Exemples :
Opérations arithmétiques
Opérateur <<
Opérateur >>
Opérateurs de comparaison
etc ...
# include"vecteur.h"
void main (void)
{ vecteur V1 (6);
vecteur V2 (6);
cin >> V1>>V2;
...cout << V1+V2
![Page 14: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/14.jpg)
Règles
Impossible de surcharger des opérateurs inconnus
Impossible de modifier l ’arité des opérateurs (exemple :+ est binaire)
Impossible de modifier les règles de priorité des opérateurs
Impossible de redéfinir les opérateurs prédéfinis sur des types reconnus par l ’opérateur.
Il faut respecter les règles syntaxiques prédéfinies
![Page 15: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/15.jpg)
SURCHARGE de +
Prototype retour operator symbole(paramètres)
class X{ public :
X operator + (const X& B);// est retourné IC+B
};
![Page 16: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/16.jpg)
Surcharge de l ’opérateur +Toute méthode d ’une classe a un premier paramètre implicite représentant l ’instance courante.
La surcharge d ’un opérateur par une fonction membre d ’une classe, implique donc que le premier paramètre représente l ’instance courante.
Par conséquent l ’instance courante est toujours l ’opérande gauche des opérateurs binaires et l’unique opérande des opérateurs unaires.
Appel de l ’opérateur (notation) : I1.operator + (I2); <=> I1+I2;
![Page 17: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/17.jpg)
Surcharge de l ’opérateur +
# include <iostream.h>
class vecteur{
public :
vecteur operator + (const vecteur& B);
// est retourné : IC+B
private :
int taille;
int t[max];
};
![Page 18: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/18.jpg)
Surcharge de l ’opérateur +
vecteur vecteur:: operator + (const vecteur& B)
{
vecteur somme;
if (taille==B.taille)
{ somme.taille=taille;
for (int i=0; i<taille;i+=1)
somme.t[i]=t[i]+B.t[i];
}
return somme;
}
![Page 19: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/19.jpg)
Surcharge des opérateurs >> et <<
Opérateur >>
Constructeur
Méthode
La classe rectanglefournit des méthodes
Une application
# include <iostream.h> # include "rectangle.h"void main (void){rectangle R1,R2;
}
Opérateur <<cin >> R1 >> R2;cout << R1 << R2;
![Page 20: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/20.jpg)
# include <iostream.h># include "rectangle.h"void main (void){rectangle R;cin >> R;
cout << R; ...
Toute méthode est déclenchée par une instance
Opérateurs de redirection de flux
L ’instance cin de la classe istream déclenche l ’opérateur >>
L ’instance coutde la classe ostream déclenche l ’opérateur <<
![Page 21: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/21.jpg)
Problème d ’accessibilité
Problème Pour écrire : cin >> R;il faut que la classe istream puisse accéder à la section private de la classe rectangle.
RésolutionDéclarer la méthode de surcharge de l ’opérateur >>comme fonction amie de la classe rectangle.
![Page 22: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/22.jpg)
Méthode amie
Mécanisme :Lorsqu ’une méthode externe à une classe C est déclarée amie dans la classe C, alors tous les membres de la classe C (y compris ceux de la section private) sont accessibles par la fonction externe.
Syntaxe :Qualificateur friend placé devant le prototype de la méthode externe à la classe.
![Page 23: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/23.jpg)
CLASSE AMIE
class X{ public :
friend class Y;
private :
};
EFFET Toutes les méthodes de la classe Y peuventaccéder à la section privatede la classe X
C ’est moi : classe X qui définit qui sont mes ami(e)s, et donc qui ouvre l ’accès de ma section private à l ’extérieur.
![Page 24: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/24.jpg)
PROTOTYPE : opérateur >>
class rectangle{public :friend istream& operator >> ( ???);
Dans la classe istream l ’opérateur >> retourne une référence sur le flux
Référence notée : istream&
![Page 25: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/25.jpg)
PROTOTYPE : opérateur >>
class rectangle{public ://IC est de type istream friend istream& operator>>(istream& f,rectangle& R);// longueur et largeur de R sont saisies
Rectangleà saisir
Afin de pouvoir enchaîner les appels : cin >> R1 >> R2;l ’opérateur retourne une référence surle flux qu ’elle a reçu en premier argument
Le premier argument est toujours une référence sur IC
![Page 26: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/26.jpg)
IMPLANTATION : opérateur >>
istream& operator>>(istream& flux,rectangle& R);{if (taille==0){ int ta; cout << "\n Taille du vecteur :";flux >> ta;if (ta <= max) taille = ta;
else taille=max;} for (int i=0; i<taille;i+=1){ cout<<"\n Valeur de l'élt No "<<i+1<< " : ";
flux >> t[i]; }
return flux;}
![Page 27: Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté](https://reader035.vdocuments.net/reader035/viewer/2022062511/551d9da2497959293b8d25ad/html5/thumbnails/27.jpg)
CLASSE VECTEUR
On considère l ’objet : vecteur d ’entiers. Exemple : V = (2,5,1,4) V est un vecteur de 4 entiers.La dimension du vecteur a une valeur maximum égale à 10.
ExerciceCoder une application permettant d ’exécuter la fonction main suivante
# include <iostream.h># include "vecteur.h"void main (void){ vecteur V(4); cin >> V; cout << V; }