Les surcharges d'opérateurs

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

Premier programme en C :
La boucle for : init7.c et init71.c
Les fonctions A quoi ça sert ?
Programmation Orienté Objet en C++
Cours n° 7 Standard Template Library II.
C++ 6ème cours Patrick Reuter maître de conférences
C++ 5ème cours Patrick Reuter maître de conférences
(Classes prédéfinies – API Java)
1 Tableaux des objets C++ si on connaît le nombre dobjets nécessaires davance on peut utiliser des tableau dobjets dans les fonctions dusage class Personne.
C.
Paramètres et pointeurs
Structures et unions types énumérés Qu'est-ce qu'une structure
1 Une introduction à Java IFT 287 (Semaine 1). 2 Java - Historique Développé par Sun Microsystems en 1994 –Inventeur James Gosling (canadien!) Objectif.
2ième Classe (Mercredi, 13 Octobre) C++ Intro CSI2572.
Athapascan-1 Interface C++ de programmation parallèle
Structures de données et algorithmes – TP2
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
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é.
HistoriqueHistorique Langage C++, parution du livre Bjarne Stroustrup Normalisation ANSI.
Structures de données IFT-2000
Structures de données IFT Abder Alikacem La classe string Département dinformatique et de génie logiciel Édition Septembre 2009 Département dinformatique.
Structures de données IFT-2000 Abder Alikacem Espace de nommage Département dinformatique et de génie logiciel Édition Septembre 2009 Département dinformatique.
Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 5 : La surcharge des opérateurs Département dinformatique.
Conteneurs STL.
GPA789 Analyse et conception orientées objet 1 Professeur: Tony Wong, Ph.D., ing. Chapitre 6 Correspondance UML et C++
1 PROTOTYPE PGC++ Vecteur_3D DÉFINITION. 2 class Vecteur_3D { private : float vx, vy, vz, vw; // Représentation en coordonnées homogènes. public : Vecteur_3D();
Un langage de programmation hybride
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Cours 4 Héritage (suite).
COURS DE PROGRAMMATION ORIENTEE OBJET :
1 Fonction : surcharge de sélection La surcharge de sélection consiste à implanter plusieurs méthodes de même nom dans une même classe à condition que.
Héritage Lhéritage permet de spécialiser une classe en définissant une relation de type « est une sorte de ». #include comptebancaire.h class CompteEpargne.
C++ : fonctions et opérateurs
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 1 Cours n° 4 Polymorphisme II.
Une introduction à Java
Formation C++. Hello World ! #include /* Commentaire sur plusieurs lignes */ int main() { //Affiche hello world std::cout
Structures de données IFT-2000
Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 1 Cours n° 3 Polymorphisme I.
Structures des données
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
La notion de type revisitée en POO
Héritage multiple En langage C++, il est possible d’utiliser l’héritage multiple. Il permet de créer des classes dérivées à partir de plusieurs classes.
11/04/ L'héritage Cours 7 Cours 7.
7ième Classe (Mardi, 24 novembre) CSI2572. Devoir 3 ?
Notions avancées du C++
Argc et argv Utilisation des paramètres de la ligne de commande.
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
Cours C++ Fonctions Surcharge d’opérateurs Passage d’arguments
Constructeurs H Batatia. Variable statique Une variable statique est partagée par tous les objets d’une classe.
HistoriqueHistorique Langage C++, parution du livre Bjarne Stroustrup Normalisation ANSI.
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Les opérateurs L’amitié Les opérateurs Introduction
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Conception de Programmes - IUT de Paris - 1ère année – Cours 6 - Les opérateurs L’amitié Les opérateurs –Introduction –Surcharge par fonction.
Conception de Programmes - IUT de Paris - 1ère année Conception de Programmes Objectifs et organisation du cours Introduction à la P.O.O.
Chapitre VII Techniques plus avancées à travers le concept de classe.
Cours C++ Master Actuariat Séance 9: La classe Liste chaînée
PRO-1027 Programmation Scientifique en C
Exception Handling "Unfortunately, it's almost accepted practice to ignore error conditions, as if we're in a state of denial about errors." Bruce Eckel.
Conception de Programmes - IUT de Paris - 1ère année Les classes Introduction Déclaration d’une classe Utilisation d’une classe Définition des.
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
Informatique 2A Langage C 5ème séance. Déroulement de la séance 5 1 ère partie Étude des chaînes de caractères 2 ème partie Les structures 3.
Transcription de la présentation:

Les surcharges d'opérateurs Ou comment se compliquer un peu la vie pour se la simplifier énormément…

Classes et types Une classe joue le rôle d'un type (struct) État + comportement Comportement : méthodes Les types de base aussi ! Types numériques : opérations arithmétiques et numériques + comportements de base : afficher / saisir

Classes et types Utiliser la même syntaxe pour un même comportement. Or, comportement = méthode… Et les opérateurs ? En C : mots-clef du langage , ou fonctions En C++ : tout est méthode !

Classes et types Un opérateur est une méthode. On peut le surcharger : adaptation à la classe Exemple avec les nombres complexes. //complex.h class Complex { double re, im; public : Complex(double=0.0,double=0.0); ~Complex(); Complex(const Complex &); // pas forcément utile void afficher() const; }

Exemple : Complex //complex.cpp #include "complex.h" #include <iostream> using namespace std; Complex::Complex(double r, double i):re(r),im(i) {} Complex::~Complex() {} Complex::complex(const Complex &z) { re = z.re; im = z.im; } void Complex::afficher() const cout << re << "+i" << im << endl; // version naïve

Exemple : Complex << est un opérateur, donc une méthode ! // main.cpp #include "complex.h" int main(int argc, char *argv[]) { Complex z(1.0,-3.5); z.afficher(); Au lieu de : cout << z << endl; return 0; } << est un opérateur, donc une méthode ! Ce serait bien plus pratique à utiliser

Opérateur << Utilisation générale : Compris comme : flot << expression; Compris comme : operator<<(flot, expression); Méthode non membre d'une classe Nom de méthode paramètres

Opérateur << : implémentation // complex.h class Complex { … friend ostream& operator<<(ostream&, const Complex &); }; // complex.cpp ostream& operator<<(ostream& os, const Complex &z) os << z.re << "+" << z.im << "i"; return os; } Donc déclarée amie de la classe Méthode non membre de classe Pas de this, un paramètre const car pas modifié Accède à re et im qui sont private

Opérateur << : implémentation // complex.cpp ostream& operator<<(ostream& os, const Complex &z) { os << z.re << "+" << z.im << "i"; return os; } Paramètre os : ostream& : référence vers un flot de sortie cout ou un fichier ! Le flot est modifié par l'écriture des données, il est donc retourné pour être traité de nouveau

Opérateur >> // complex.h class Complex { … friend istream& operator>>(istream&, Complex &); }; // complex.cpp istream& operator>>(istream& is, Complex &z) is >> z.re; is >> z.im; return is; } Le paramètre n'est plus const car modifié par la saisie !

Opérateurs mathématiques Sont également surchargeables : + - * / += -= *= /= Exemple avec + : operator+ Méthode membre ou méthode amie ? Méthode membre de classe : class Complex {… Complex operator+(const Complez &); // un seul paramètre ? } Méthode amie Class Complex { friend Complex operator+(const Complex &, const Complex &); Pas de piège : c'est simplement le type de retour de la méthode !

Operateur + : méthode membre // complex.h class Complex {… Complex operator+(const Complez &); // un paramètre ? }; //complex.cpp Complex Complex::operator+(const Complex &z) { Complex resul; resul.re = this->re + z.re; resul.im = im + z.im; return resul; } Oui, car appelé par un objet de type complexe : this est le premier terme Ou return(Complex(re+z.re,im+z.im));

Operateur + : méthode membre // main.cpp #include "complex.h" int main(int argc, char *argv[]) { Complex z1(1,1), z2(4,3), z3; z3 = z1+z2; // ok z3 = z1+z2+z3; // ok return 0; } Inconvénient : le premier terme de + doit être de classe Complex (car méthode membre) Compris comme : z3 = z1.operator+(z2); Compris comme : z3 = z1.operator+(z2.operator+(z3));

Operateur + : méthode amie // complex.h class Complex {… friend Complex operator+(const Complez &, const Complex &); }; //complex.cpp Complex operator+(const Complex &z1, const Complex &z2) { Complex resul; resul.re = z1.re + z2.re; resul.im = z1.im + z2.im; return resul; } Rappel : accède à re et im qui sont private ! Ou return(Complex(z1.re+z2.re,z1.im+z2.im));

Operateur + : méthode amie // main.cpp #include "complex.h" int main(int argc, char *argv[]) { Complex z1(1,1), z2(4,3), z3; z3 = z1+z2; // ok z3 = z1+z2+z3; // ok return 0; } Les 2 termes doivent pouvoir être convertis en Complex. Addition double+Complex ? Compris comme : z3 = operator+(z1,z2); Compris comme : z3 = operator+(z1,operator+(z2,z3));

Opérateurs modifiant l'objet Exemple : opérateur += Doit respecter l'associativité : retour de référence Retour de la valeur de l'objet modifié : c'est *this Prototype : Complex& operator+=(const Complex &); Complex& Complex::operator+=(const Complex& z) { re = re+z.re; // ou re += z.re; im = im+z.im; // ou im += z.im; return *this; }

Conversions Constructeurs de conversion Convertir une valeur d'un type (ou classe) T vers un type (ou classe) D :créer un constructeur de D ayant un argument de type T Application : //complex.h : Class Complex{… Complex(double r); }; //complexe.cpp Complex::Complex(double r):re(r),im(0) {} Assure la conversion double-> Complex

Conversions Méthodes de conversion Convertir un Complex en double (pour calcul de module par exemple) Méthode nommé operator T() où T est le type de destination : operator double(); Complex::operator double() { return sqrt((re*re)+(im*im)); } Sans type de retour (le nom l'indique)

Conversions : utilisation void f(double val) // fonction non membre de classe { cout << val << endl; } int main(int argc, char *argv[]) Complex z(1,1); f(z); // conversion en double 1.414

L'opérateur d'affectation = Similaire au constructeur par recopie : à fournir lorsque la classe contient des attributs de type pointeur // exemple.h class Toto {…}; class Exemple { Toto *var; public : Exemple(…); Exemple(const Exemple &); // par recopie ~Exemple(); Exemple& operator=(const Exemple&); // affectation };

L'opérateur d'affectation = //exemple.cpp Exemple& Exemple::operator=(const Exemple &source) { if (var) delete var; } var = new Toto(*(source.var)); return *this; source Exemple Toto (à recopier) var Toto (recopié) Exemple Toto (avant affectation) this var

L'opérateur d'affectation = Et si &source == this ??? (auto-affectation) Exemple& Exemple::operator=(const Exemple &source) { if (var) delete var; } var = new Toto(*(source.var)); return *this; source Exemple Toto (à recopier) var Exemple Toto (avant affectation) this var

L'opérateur d'affectation = //exemple.cpp Exemple& Exemple::operator=(const Exemple &source) { if (&source != this) if (var) delete var; } var = new Toto(*(source.var)); return *this;

L'opérateur [] Indexation : choisir le type de l'index et le type de retour : sécuriser les accès à un tableau class TableauSec { long *valeurs; // plus tard, on mettra ce qu'on veut long taiMax; long taiUtil; public : TableauSec(long=10); TableauSec(const TableauSec&); ~TableauSec(); TableauSec& operator=(const TableauSec&); long& operator[](long); TableauSec& operator+(long); };

Digression : opérateur+ Ajouter un élément au tableau en faisant tab = tab+element ! Prototype : TableauSec& operator+(long); // dans tableausec.cpp TableauSec& TableauSec::operator+(long val) { if (taiUtil < taiMax) valeurs[taiUtil++] = val; } return *this; // retour du tableau modifié Message du Ministère du C++ : l'abus de surcharge peut être dangereux pour la santé mentale.

L'opérateur [] Prototype : long& operator[](long); // dans tableausec.cpp long& TableauSec::operator[](long index) { if ((index >=0) && (index < taiutil)) return valeurs[index]; } else // que faire ici ? On verra plus tard !