Conception de Programmes - IUT de Paris - 1ère année – 2001-20021 Cours 6 - Les opérateurs L’amitié Les opérateurs –Introduction –Surcharge par fonction.

Slides:



Advertisements
Présentations similaires
Introduction au Langage C,C++
Advertisements

Programmation Orienté Objet en C++
Programmation Orienté Objet en C++
Cours n° 2 Les entrées-sorties Biliothèque C++ (iostream) –
Cours n° 7 Standard Template Library II.
Le langage C++ Les types structurés
C++ 6ème cours Patrick Reuter maître de conférences
C++ 5ème cours Patrick Reuter maître de conférences
1 Quelques précisions sur l'héritage. 2 Signification de super.f() appel à la méthode f() masquée super : désigne l'objet appelant comme s'il était de.
(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.
POO.
C.
Programmer en JAVA par Tama
Introduction à la POO: Les classes vs les objets
1 Une introduction à Java IFT 287 (Semaine 1). 2 Java - Historique Développé par Sun Microsystems en 1994 –Inventeur James Gosling (canadien!) Objectif.
Regrouper des éléments de même type et pouvoir y accéder à laide dun identificateur et dun indice. Objectif des tableaux.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
TRAITEMENT DE STRUCTURES
Principes de programmation (suite)
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
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é.
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.
Conteneurs STL.
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();
IFT 6800 Atelier en Technologies d’information
Types de données abstrait et mécanismes d'encapsulation
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.
C++ : fonctions et opérateurs
CSI1502 Principes fondamentaux en conception des logiciels
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é.
INF1101 Algorithmes et structures de données
Structures de données IFT-2000
Une introduction à Java
Les Types de données complexes
Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 1 Cours n° 3 Polymorphisme I.
Types de données fondamentaux
Chapitre IX Gestion de flux.
AP4 - Programmation Orientée Objet Chapitre 3 : Programmation Objet en C++ class Entier { int i; int lit_i(void); void Ecrit_i(int); }; int Entier::lit_i(void)
2.1 - Historique Chapitre 2 : Introduction au langage C++
4 Introduction des objets. Les chaînes et tableaux
Labo II : Tableaux et pointeurs
La notion de type revisitée en POO
11/04/ L'héritage Cours 7 Cours 7.
Les objets Les classes Pour structurer les variables élémentaires, on peut : juxtaposer des variables de même type, en déclarant un tableau juxtaposer.
Programmation objet La base.
7ième Classe (Mardi, 24 novembre) CSI2572. Devoir 3 ?
Cours C++ Fonctions Surcharge d’opérateurs Passage d’arguments
Les opérateurs L’amitié Les opérateurs Introduction
Les surcharges d'opérateurs
Cours LCS N°4 Présenté par Mr: LALLALI
Conception de Programmes - IUT de Paris - 1ère année – Cours 8 – Les entrées/sorties Comment fonctionnent les opérateurs > pour les types élémentaires.
Conception de Programmes - IUT de Paris - 1ère année Cours 2 – Références et passage de paramètres Les Références –Introduction aux références.
Conception de Programmes - IUT de Paris - 1ère année Conception de Programmes Objectifs et organisation du cours Introduction à la P.O.O. et au.
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.
Conception de Programmes - IUT de Paris - 1ère année Quelques éléments du langage C++ Les références La surcharge de fonctions Les fonctions «
PRO-1027 Programmation Scientifique en C
Langage de Programmation Orientée Objet : C++
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.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Correction du TD Chapitre 2.
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
1 Programmation en C++ Fonctions ● Déclaration et définition de fonctions ● Arguments ● Surcharge ● Arguments optionnels ● Fonctions constantes ● Fonctions.
Int 10. Int 6.
Transcription de la présentation:

Conception de Programmes - IUT de Paris - 1ère année – Cours 6 - Les opérateurs L’amitié Les opérateurs –Introduction –Surcharge par fonction et par méthode –Généralités –Opérateurs arithmétiques et relationnels –Opérateurs d’entrée/sortie –Opérateur d’incrémentation et de décrémentation –Autres opérateurs

Conception de Programmes - IUT de Paris - 1ère année – L’amitié Toute fonction peut être déclarée «amie» d’une (ou plusieurs) classe(s) Une fonction « amie » d’une classe peut accéder directement (sans passer par des méthodes) aux éléments privés de la classe Exemple class Personne { public:... friend void afficher(const Personne &); private: char nom[20]; int age; }; void afficher(const Personne &p) { cout << p.nom << p.age << endl; } La fonction afficher est «amie» de la classe Personne Elle accède aux données privées de la classe

Conception de Programmes - IUT de Paris - 1ère année – Une classe peut aussi être déclarée «amie» d’une autre classe Dans ce cas, toutes les méthodes de la classe « amie » peuvent accéder directement aux éléments privés de la classe Exemple class Personne { public:... friend class Collect; private: char nom[20]; int age; }; class Collect { public: void AfficherNoms() const;... private: Personne tab[10]; int nb; }; void Collect::AfficherNoms() const { for (int i=0; i<nb; i++) cout << tab[i].nom << endl; }

Conception de Programmes - IUT de Paris - 1ère année – Il ne faut pas abuser de l’usage de friend  une fonction ou une classe ne doit être déclarée amie que dans des cas extrêmes Exemple: class Liste { public: Liste(); void Ajouter(const Personne&);... private: Element *debut; }; class Personne { public:... friend class Element; friend class Liste; private: char nom[20]; int age; }; class Element { friend class Liste; private: Personne p; Element *suivant; }; Aucun membre de la classe Element n’est public excepté pour la classe Liste  seule cette classe peut employer des objets de la classe Element

Conception de Programmes - IUT de Paris - 1ère année – Les opérateurs Le C++ autorise la surcharge des opérateurs L’objectif est de permettre au programmeur de fournir une notation plus conventionnelle et pratique que la notation fonctionnelle de base (par exemple, pour la manipulation d’objets arithmétiques complexes) Il existe 2 manières de surcharger un opérateur –Un opérateur peut être surchargé par une fonction. Dans ce cas au moins une opérande doit être de type «classe». –Un opérateur peut être surchargé par une méthode d’une classe. Dans ce cas, la première opérande est l’objet pour laquelle la méthode est invoquée.

Conception de Programmes - IUT de Paris - 1ère année – Surcharge par une fonction class Vecteur3d { public: Vecteur3d(int=0, int=0, int=0); int get(int i) const; private: int x, y, z; }; Vecteur3d operator+(const Vecteur3d&, const Vecteur3d&);

Conception de Programmes - IUT de Paris - 1ère année – // constructeur Vecteur3d::Vecteur3d(int a, int b, int c) { x = a; y = b; z = c; } // récupération d’une valeur int Vecteur3d::get(int i) const { assert((i>=1) && (i<=3)); switch (i) { case 1: return x; case 2: return y; case 3: return z; }

Conception de Programmes - IUT de Paris - 1ère année – // Addition de 2 Vecteurs Vecteur3d operator+(const Vecteur3d& v1, const Vecteur3d& v2) { int i, j, k; i = v1.get(1) + v2.get(1); j = v1.get(2) + v2.get(2); k = v1.get(3) + v2.get(3); return Vecteur3d(i,j,k); }  Question : que faire pour que la fonction puisse accéder directement aux données de la classe Vecteur3d ?

Conception de Programmes - IUT de Paris - 1ère année – La fonction (l’opérateur) peut être invoquée de 2 façons // utilisation de la classe Vecteur void main() { Vecteur3d a(1,2,3), b(3,2,1), c, d; c = operator+(a, b); // notation fonctionnelle d = a + b;// notation usuelle for (int i=1; i<=3; i++) cout << c.get(i) << " " ; cout << endl; for (int i=1; i<=3; i++) cout << d.get(i) << " " ; cout << endl; }

Conception de Programmes - IUT de Paris - 1ère année – Surcharge par une méthode class Vecteur3d { public: Vecteur3d(int=0, int=0, int=0); int get(int i) const; int operator*(const Vecteur3d&) const; private: int x, y, z; }; Vecteur3d operator+(const Vecteur3d&, const Vecteur3d&); // multiplication de 2 Vecteurs int operator*(const Vecteur3d& v) const { int res; res = (this->x * v.x) + (y * v.y) + (z * v.z); return res; } Opérateur binaire: l’opérande gauche est l’instance courante l’opérande droite est le paramètre

Conception de Programmes - IUT de Paris - 1ère année – La méthode (l’opérateur) peut être invoquée de 2 façons // utilisation de la classe Vecteur void main() { Vecteur3d a(1,2,3), b(3,2,1); int c, d; c = a.operator*(b); // notation fonctionnelle d = a * b;// notation usuelle cout << c << endl;// valide si l’opérateur cout << d << endl;// << est défini }

Conception de Programmes - IUT de Paris - 1ère année – De nombreux opérateurs peuvent être surchargés +-*/%^&|~! =<> +=-=*=/=%=^=&= |= >>>= =&& ||++--->*,->[]() newdelete On doit conserver leur « pluralité » (i.e. nombre d’opérandes). Les opérateurs redéfinis gardent leur priorité et leur associativité (ordre d’évaluation) On ne doit pas faire d’hypothèse sur la signification a priori d’un opérateur. Par exemple, la signification de += pour une classe ne peut en aucun cas être déduite de la signification de + et de = pour cette même classe. Généralités

Conception de Programmes - IUT de Paris - 1ère année – Il n’est pas possible de définir de nouveaux opérateurs. Un opérateur doit être soit une méthode d’une classe, soit une fonction prenant au moins un objet de classe en argument. En particulier, il n’est pas possible de définir une fonction opérateur ne prenant en argument que des pointeurs. Il n’est donc pas possible de modifier la signification des opérateurs usuels prédéfinis (telle que l’addition entre deux entiers par exemple). Cela garantit que le C++ est extensible mais non-modifiable

Conception de Programmes - IUT de Paris - 1ère année – Cas particuliers –Les opérateurs [], (), ->, new et delete doivent obligatoirement être définis par des méthodes (et non pas des fonctions) –Les opérateurs = (affectation) et & (pointeur sur) possèdent une signification prédéfinie pour les objets de n’importe quel type classe mais peuvent être surchargés. –Les opérateurs new et delete doivent obligatoirement avoir les prototypes suivants: class C { public: void * new(size_t); void delete(C*);... };

Conception de Programmes - IUT de Paris - 1ère année – class Vecteur3d { public: Vecteur3d(int=0, int=0, int=0); int get(int i) const; Vecteur3d operator+(const Vecteur3d&) const; int operator*(const Vecteur3d&) const; int operator==(const Vecteur3d& v) const; // comparaison Vecteur3d operator*(int) const; // produit friend Vecteur3d operator*(int, const Vecteur3d& v); private: int x, y, z; }; Opérateurs arithmétiques et relationnels Attention : cette fonction ne peut pas être transformée en une méthode l ’opérande gauche n’est pas une instance de la classe

Conception de Programmes - IUT de Paris - 1ère année – // comparaison (c’est une méthode) int Vecteur3d::operator==(const Vecteur3d& v) const { return ((x == v.x) && (y == v.y) && (z == v.z)); } // produit vecteur-entier (c’est une méthode) Vecteur3d Vecteur3d::operator*(int i) const { Vecteur3d v(x*i, y*i, z*i); return v; } // produit entier-vecteur (c’est une fonction) Vecteur3d operator*(int i, const Vecteur3d& v) { return v * i; }

Conception de Programmes - IUT de Paris - 1ère année – Opérateurs d’entrée/sortie On veut pouvoir utiliser les opérateurs > pour afficher et saisir des vecteurs Leurs prototypes sont ostream& operator<<(ostream& os, const Vecteur3d& v); istream& operator>>(istream& os, Vecteur3d& v); ostream est le type de cout et istream celui de cin Ces opérateurs ne peuvent être définis comme étant des méthodes de la classe Vecteur3d. En effet, l’opérande gauche appartient à la classe ostream et istream. Il faudrait donc les définir comme étant méthodes de ces classes (ce qui est impossible). On doit donc les définir comme étant des fonctions (amies ou non) de la classe Vecteur3d

Conception de Programmes - IUT de Paris - 1ère année – class Vecteur { public: Vecteur3d(int=0, int=0, int=0); int get(int i) const; Vecteur3d operator+(const Vecteur3d&) const; int operator*(const Vecteur3d&) const; int operator==(const Vecteur3d& v) const; Vecteur3d operator*(int) const; friend Vecteur3d operator*(int, const Vecteur3d& v); // entrée (saisie) friend istream& operator>>(istream&, Vecteur3d&); private: int x, y, z; }; // sortie (affichage) ostream& operator<<(ostream&, const Vecteur3d&);

Conception de Programmes - IUT de Paris - 1ère année – // saisie istream& operator>>(istream& is, Vecteur& v) { is >> v.x >> v.y >> v.z; return is; } // affichage ostream& operator<<(ostream& os, const Vecteur3d& v) { for (int i=1; i<=3; i++) os << v.get(i) << endl; return os; }

Conception de Programmes - IUT de Paris - 1ère année – // Utilisation de la classe Vecteur3d void main() { Vecteur3d a(5, 10, 15); Vecteur3d b; cin >> a; // saisie b = a*2; // produit et affectation if (b==(2*a)) // produit et comparaison cout << " c’est correct " << endl; else { // affichage cout << " probleme " << endl; cout << a*2 << endl << 2*a << endl; }

Conception de Programmes - IUT de Paris - 1ère année – Opérateur d’incrémentation et de décrémentation Les opérateurs d’incrémentation ( ++ ) et de décrémentation ( -- ) peuvent être utilisés de manière préfixée ( ++x ) ou postfixée ( x++ ) La forme postfixée est distinguée de la forme préfixée par l’emploi d’un argument (de type int ) supplémentaire non- utilisé class Vecteur3d { public:... Vecteur3d operator++(); // préfixée Vecteur3d operator++(int);// postfixée private:... };

Conception de Programmes - IUT de Paris - 1ère année – // incrémentation préfixée Vecteur3d Vecteur3d::operator++() { x++; y++; z++; return *this; // renvoi de la valeur après incrément. } // incrémentation postfixée Vecteur3d Vecteur3d::operator++(int) { Vecteur3d res(*this); // construction par copie ++(*this); // incrémentation de l’instance return res; // renvoi de la valeur avant incrément. }

Conception de Programmes - IUT de Paris - 1ère année – Autres Opérateurs Beaucoup d’opérateurs peuvent être surchargés A titre d’exemple, voici un opérateur d’indexation pour la classe Vecteur3d class Vecteur3d { public:... int& operator[](int); int operator[](int) const; private:... };

Conception de Programmes - IUT de Paris - 1ère année – // adressage indexe int& Vecteur3d::operator[](int i) { assert((i>=1) && (i<=3)); return (i==1 ? x : (i==2 ? y : z)); } int Vecteur3d::operator[](int i) const { assert((i>=1) && (i<=3)); return (i==1 ? x : (i==2 ? y : z)); } // Utilisation void main() { Vecteur3d a; for (int i=1; i<=3; i++) a[i] = i; // écriture for (int i=1; i<=3; i++) cout << a[i] << endl; // lecture } Conclusion: un vecteur peut être vu comme un tableau