Vous êtes sur la page 1sur 40

UNIVERSITE HASSAN II - AIN CHOCK CASABLANCA ECOLE NATIONALE SUPERIEURE DELECTRICITE ET DE MECANIQUE

Notion de surcharge en C++


Prsent par:
-- Kawtar LAMRANI
- Abdelmourhite ABOULFARAJ

- Arakil CHENTOUFI
- Fatima zahra ELFATRI LAMGHARI

Surcharge en C++

Dfinition:

En C++, la surcharge est la redfinition de types, doprateurs, de fonctions et de mthodes.

Surcharge des fonctions

Dfinition:
En C++ des fonctions diffrentes (mthodes comprises) peuvent avoir le mme nom, la condition que leurs signatures soient assez diffrentes. Lors de chaque appel, le nombre et les types des arguments effectifs permettent de choisir sans ambigut la fonction appeler.

Surcharge des fonctions

Exemple :
int addition(int x, int n) { }

double addition(double x, double y) {


} double addition(double x, double y, double z) {

Surcharge des fonctions

Exemple (suite) : Le programmeur n'aura connatre que le nom addition . Il crira dans tous les cas: c = addition( liste arguments); Le compilateur choisira la fonction la plus adapte, selon le nombre et le type des arguments effectifs.

Surcharge des mthodes

Remarque :

Lutilisation de plusieurs mthodes de mme nom, chacune dans une classe nest pas une surcharge.
Les mthodes surcharges se trouvent toutes dans une mme classe.

Surcharge des mthodes

Objectif :
Comme le constructeur est une mthode, on a le droit de le surcharger lui aussi. Cela permet de crer un objet de plusieurs faons diffrentes.

Surcharge des mthodes

Exemple :
class point { int x, y ; public : point() { x = 0 ; y = 0; } point (int abs, int ord) { x = abs ; y = ord ; } void deplacer() { x = 0 ; y = 0; } void deplacer(int a, int b) { x += a ; y += b; }

};

Constructeur de copie

Dfinition :
Une mthode appel par le compilateur lorsqu'on construit un objet en lui affectant directement un autre objet. Son rle est de copier la valeur de tous les attributs du premier objet dans le second.

Constructeur de copie

Dfinition :
Le constructeur par copie d'une classe C est un constructeur dont le paramtre est de type Classe & (rfrence sur un objet de mme Classe) .

Constructeur de copie

Cas de gnration :
class Cercle { public: Cercle();
private: Float rayon;

};
Main() { Cercle C1; Cercle C2(C1); }

Constructeur de copie

Cas de gnration :
class Cercle

{
public: Cercle(); private: Float rayon; }; Main() { Cercle C1; Cercle C2 = C1; }

Constructeur de copie

Cas de gnration :

Les 2 critures sont quivalentes:


Cercle C2(C1); Cercle C2 = C1;

Constructeur de copie

Cas de gnration :
class Cercle

{
instructions }; void Dessiner(Cercle C1) { } Main() { Dessiner(C1); }

Constructeur de copie

Principe de fonctionnement :
Sil nest pas crit, il sera gnr automatiquement par le compilateur. Il copier la valeur de tous les attributs y compris les pointeurs (sils existent).

Dans ce cas, les 2 objets se retrouvent avec un mme pointeur sans que le compilateur ne puisse allouer de la mmoire doublement.

Constructeur de copie

Exemple :
class point { int x, y ; public : point() { x=0 ; y=0; } point (int abs, int ord) { x = abs ; y = ord ; } };

Constructeur de copie

Exemple :
class Cercle { public: Cercle(); Cercle(Cercle & ); ~Cercle(); private: Float rayon; Point *centre; }; // constructeur de copie

// pointeur sur lobjet de type Point

Constructeur de copie

Principe de fonctionnement :

Main() { Cercle C1(rayon1, centre1) ; Cercle C2 = C1; }

Constructeur de copie

Principe de fonctionnement :
C1
Float rayon1
Point *centre1

C2
Float rayon1
Point *centre1

Point

Constructeur de copie

Principe de fonctionnement :
C1
Float rayon1
Point *centre1

C2
Float rayon1
Point *centre2

Point

Point

Constructeur de copie

Dfinition (implmentation) :

Cercle(Cercle & C)

{
Rayon = C.rayon; Centre = C.centre; // cest un pointeur }

Constructeur de copie

Dfinition (implmentation) :

Copier l'objet de type Point (centre) en faisant une allocation dynamique, donc un new. centre = new Point();

Constructeur de copie

Dfinition (implmentation) : Cercle(Cercle & C) { Rayon = C.rayon; // Centre = C.centre; Centre = new Point(); }

Constructeur de copie

Dfinition (implmentation) : Cercle(Cercle & C)


{ Rayon = C.rayon; // Centre = C.centre; // Centre = new Point(); Centre = new Point(C.centre); }

Constructeur de copie

Dfinition (implmentation) :
Cercle(Cercle & C) { Rayon = C.rayon; // Centre = C.centre; // Centre = new Point(); // Centre = new Point(C.centre); Centre = new Point(*(C.centre)); }

Surcharge doprateurs

Dfinition:

Une technique qui permet de donner une nouvelle signification aux oprateurs existants lorsquils portent (en partie ou en totalit) sur des objets de type classe.

Surcharge doprateurs

Prototype: Crer la fonction operator+ en tant que: fonction amie: Friend Objet operator+(Objet & , Objet & ); fonction membre: Objet operator+(Objet & );

Surcharge doprateurs

Exemples :
fonction amie:

Friend Duree operator+(Duree & , Duree & );


fonction membre:

Duree operator+(Duree & );

Surcharge doprateurs

Principe de fonctionnement :

Se limiter aux oprateurs existants, en conservant leur pluralit (unaire, binaire). Les oprateurs surchargs gardent leur priorit et leur associativit habituelle.

Surcharge doprateurs

Principe de fonctionnement :

La signification de += pour une classe ne peut en aucun cas tre dduite de la signification de + surcharg et de = surcharg pour cette mme classe.

Surcharge doprateurs

Principe de fonctionnement : resultat = duree1 + duree2; Est traduite par le compilateur : 1 cas: resultat = operator+(duree1, duree2);

2 cas: resultat = duree1.operator+(duree2);

Surcharge doprateurs

Exemples : Class Duree { int h; int min; int sec; Public: Duree() { h=0; min=0;sec=0; } Duree operator+(Duree & ); };

Surcharge doprateurs

Exemple :
Duree::Duree operator+(Duree & d) { Duree result; result.h=h+d.h; result.min=min+d.min; result.sec=sec+d.sec; return result; }

Surcharge de types

Dfinition :

Dfinition dune fonction membre, de nom operator nom_type ( ), sans argument et renvoyant une valeur de type nom_type .

Surcharge de types

Exemple :
class point { int x, y ; public : point (int abs=0, int ord=0) { x = abs ; y = ord ; } operator int () { return x ; };

Surcharge de types

Exemple (suite):

main() { point a( ); int b= (int)a; };

Surcharge de types

Exemple :
class Fract { int num; int den; public : operator double()

{ return (double)num /(double)den; }


};

Surcharge de types

Exemple (suite) :

void main() { Fract a(5,6); double i = double(a); double j = (double)a; }

Surcharge

Exercice:
Soit une classe vecteur3d dfinie comme suit : class vecteur3d { float x, y, z ; public : vecteur3d (float c1=0.0, float c2=0.0, float c3=0.0) { x = c1 ; y = c2 ; z = c3 ; } }; Dfinir les oprateurs == et != de manire quils permettent de tester la concidence ou la non-concidence de deux points : a. en utilisant des fonctions membres; b. en utilisant des fonctions amies.

Surcharge de types

solution
class vecteur3d { float x, y, z ; public : vecteur3d (float c1=0.0, float c2=0.0, float c3=0.0) { x = c1 ; y = c2 ; z = c3 ; } int operator == (vecteur3d) ; int operator != (vecteur3d) ; } ; int vecteur3d::operator == (vecteur3d v) { if ( (v.x == x) && (v.y == y) && (v.z ==z) ) return 1 ; else return 0 ; } int vecteur3d::operator != (vecteur3d v) {return ! ( (*this) == v ) ; }