27
Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier versité de Franche-Comté

Leçon 2 : Surcharge des opérateurs

  • Upload
    zamir

  • View
    52

  • Download
    3

Embed Size (px)

DESCRIPTION

IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier. Université de Franche-Comté. Leçon 2 : Surcharge des opérateurs. 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) - PowerPoint PPT Presentation

Citation preview

Page 1: Leçon 2 : Surcharge des opérateurs

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

Leçon 2:Surcharge des opérateurs

La surchargeIntérêt de la surchargeRègles de surchargeOpérateurs arithmétiques (classe vecteur)Opérateurs de redirection de fluxFonctions et classes amies

Page 3: Leçon 2 : Surcharge des opérateurs

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

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

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

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

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

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

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

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

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

SURCHARGE des OPERATEURS

INTERÊTS :Facilité d’écritureFacilité de lectureLisibilité

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

SURCHARGE des OPERATEURS

Exemples :Opérations arithmétiquesOpérateur <<Opérateur >>Opérateurs de comparaisonetc ...

# 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

RèglesImpossible de surcharger des opérateurs inconnusImpossible de modifier l ’arité des opérateurs (exemple :+ est binaire)Impossible de modifier les règles de priorité des opérateursImpossible 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

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

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

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

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

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

# 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

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

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

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

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

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

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

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; }