Chapitre 3 - Classes Et Objets

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 85

Programmation Orientée

Objets

R. Ben Abbou & A. Zahi


FSTF, Fez, Maroc
Programmation Orientée
Objets

Chapitre 3
Classes et Objets
Plan
 Structures
 Classes
 Constructeur & Destructeur
 Objets dynamiques
 Membres statiques
 Surdéfinition des fonctions
 Fonctions amies
 Surcharge des opérateurs
 Organisation du code
2011-2012 LST INFO, FSTF 3
Les structures
 En C les structures contiennent uniquement des données
 Exemple
Struct point {
int x;
int y;
};

 En C++ les structures peuvent contenir des fonctions


 Exemple
struct point { int x;
int y;
void initialise(int,int);
void deplace(int,int);
void affiche();
};
2011-2012 LST INFO, FSTF 4
Les structures
 L’accès aux champs de la structure peut
s’effectuer directement ou via les fonctions

 Exemple

Point a, b;

a.x=10;
équivalent à a.initialise(10,20)
a.y=20;
2011-2012 LST INFO, FSTF 5
Les structures
 Exemple
#include<iostream.h>
Using namaspace std; Int main()
struct point { int x; int y; {
void initialise(int,int); point a,b;
void deplace(int,int);
void affiche(); a.initialise (10,20);
}; a.affiche();
void point::initialise(int abs,int ord) a.deplace (5,5);
{ a.affiche();
x=abs;
y=ord; b.x=1;
} b.y=1;
void point::deplace(int dx,int dy)
b.affiche();
{
return 0;
x+=dx;
}
y+=dy;
}
void point::affiche()
{
cout << "position :" <<x <<"," <<y <<"\n";
}
2011-2012 LST INFO, FSTF 6
Notion de classe
 Généralisation de la notion de type
 Réunir données et traitement dans la même
entité

 Intégration d’un certain niveau de sécurité


 Les données sont, généralement, protégées:
seules les méthodes de la classe peuvent y
accéder

2011-2012 LST INFO, FSTF 7


Notion de classe

 Exemple

class point {
int x;
int y;
public:
void initialise(int,int);
void deplace(int,int);
void affiche();
};

2011-2012 LST INFO, FSTF 8


Classes
 Droit d’accès aux membres

 Trois modes d’accès aux membres d’une classe:

 Public : accès permis à partir de n’importe quel point


du programme

 Private
– Seules les méthodes de la classe peuvent accéder
au membre "privé"

– mode par défaut

 Protected : sémantique liée à l’héritage

2011-2012 LST INFO, FSTF 9


Classes
 Droit d’accès aux membres

 Les modes d’accès concernent les membres données et


les méthodes

 Une fonction membre privée ne peut être appelée qu’à


partir d’une autre fonction membre

 Les membres données peuvent être "public" mais c’est


déconseillé, cela contredit le concept d’encapsulation

 La structure en C++ est un cas particulier de classe où


tous les membres sont publics
2011-2012 LST INFO, FSTF 10
Classes
 Droit d’accès aux membres
 Les mots clés public, private et protected peuvent
figurer plusieurs fois lors de la déclaration de la classe

 Exemple
class point {
private:
int x;
int y;
public:
void initialise(int,int);
void deplace(int,int);
void affiche();
private:
int calculer(int p);
};

2011-2012 LST INFO, FSTF 11


Classes

 Définition des fonctions membres

 Les fonctions membres sont définies de la


même manière que les fonctions ordinaires

 Les fonctions membres peuvent accéder aux


membres données (sans les passer en
paramètre)

 La fonction membre est indexée (opérateur de


porté ::) par le nom de sa classe
2011-2012 LST INFO, FSTF 12
Classes
 Définition des fonctions membres
 Syntaxe
Type nom_classe :: nom_fonction (type param,…)
{
corps de la fonction
}
 Exemple
void point::deplace(int dx,int dy)
{
x+=dx;
y+=dy;
}
void point:: affiche()
{
cout << "position :" <<x <<"," <<y <<"\n";
};

2011-2012 LST INFO, FSTF 13


Classes
 Instances de classe : objets
 L’instanciation d’une classe se fait par une
simple déclaration
 Objets statiques :
– nom_class ob1, ob2; // objets statiques

 Objets dynamiques: nécessité d’allouer de la


mémoire
– nom_class *ob1, *ob2 // objets dynamiques

– ob1 = new nom_class ;


– ob2 = new nom_class ;

2011-2012 LST INFO, FSTF 14


Classes
 Instances de classe : objets
 Affectation d’objets:

 nom_class ob1, ob2;


 ob2 = ob1;
– Copie les valeurs des membres données de ob1
dans ob2
– Attention!! Si l’objet contient des membres
données dynamiques

Risque d’incohérence

2011-2012 LST INFO, FSTF 15


Classes
 Exemple
#include<iostream>

Using namespace std;

class point {
int x;
int y;

public:
void initialise(int,int);
void deplace(int,int);
void affiche();

};

2011-2012 LST INFO, FSTF 16


Classes
 Exemple
void point::initialise(int abs,int ord)
{
x=abs;
y=ord;
}

void point::deplace(int dx,int dy)


{
x+=dx;
y+=dy;
}

void point::affiche()
{
cout << "position :" <<x <<"," <<y <<"\n";
}

2011-2012 LST INFO, FSTF 17


Classes
 Exemple
int main()
{
point a,b;

a.initialise (10,20);
a.affiche();

b=a;
b.affiche();

b.deplace(3,3);
b.affiche();
return 0;
}

2011-2012 LST INFO, FSTF 18


Classes
 Instances de classe
 Objet contenant un membre données
dynamique
 Exemple
#include<iostream>
using namespace std;
class point {
int *x;
int *y;
public:
void initialise(int,int);
void deplace(int,int);
void affiche();
};
2011-2012 LST INFO, FSTF 19
Classes
 Instances de classe
 objet contenant un membre données
dynamique
 Exemple
void point::initialise(int abs,int ord)
{
x = new int; y=new int;
*x = abs; *y=ord;
}
void point::deplace(int dx,int dy)
{
*x+=dx;
*y+=dy;
}
void point::affiche()
{
cout << "position :" <<*x <<"," <<*y <<"\n";
}
2011-2012 LST INFO, FSTF 20
Classes
 Instances de classe
 objet contenant un membre données
dynamique
 Exemple
int main()
{
point a,b;

a.initialise (10,20);
a.affiche();

b=a;
b.affiche();

b.deplace(13,23); // a aussi se deplace


a.affiche();

2011-2012 LST INFO, FSTF 21


Classes
 Exercice

 Définir la classe rationnel avec les fonctions membres


suivantes:
 Données membres dynamique
 Saisi d’un rationnel
 Affichage d’un rationnel
 Initialisation des données membres
 Conversion d’un rationnel en un réel
 Inversion d’un rationnel

 Ecrire un programme principal qui permet de


 Créer un rationnel
 L’affecter à un autre
 Initialiser le deuxième rationnel
 Afficher le premier

 Proposer une solution pour résoudre le problème engendré par


l’affectation
2011-2012 LST INFO, FSTF 22
Constructeur / Destructeur
 Deux fonctions membres spéciales
 Constructeur : initialise les objets de la
classe

 Destructeur : détruit les objets de la


classe

 Toutes les deux sont facultatives

2011-2012 LST INFO, FSTF 23


Constructeur
 Initialiseles membres données de l’objet
lors de sa déclaration par:
 Les valeurs passées en paramètres

 Un autre objet existant de la même classe


(constructeur de recopie)

 Allouede la mémoire si l’objet contient


une partie dynamique
2011-2012 LST INFO, FSTF 24
Constructeur
 Caractéristiques

 Porte le nom de la classe

 N’a pas de type de retour

 Peut avoir des paramètres

 Est facultatif
 S’il n’est pas défini le compilateur génère un constructeur
par défaut

2011-2012 LST INFO, FSTF 25


Constructeur
 Caractéristiques

 Syntaxe
nom_classe::nom_classe([param1,…]) {…}

 Peut être surdéfini


nom_classe::nom_classe(param1,param2) {…}
//avec deux paramètres

nom_classe::nom_classe(param1) {…} // un seul


paramètre

nom_classe::nom_classe() {…} // sans paramètres

2011-2012 LST INFO, FSTF 26


Constructeur
 Caractéristiques

 Est appelé implicitement lors de la déclaration


 Objets statiques
nom_classe ob1(val1,val2);
nom_classe ob2(val);
nom_classe ob3;

 Objets dynamiques

nom_classe *ob4; ob4 =new nom_classe (val1,val2)


nom_classe *ob5; ob5 =new nom_classe (val)
nom_classe *ob6; ob6 =new nom_classe ()

2011-2012 LST INFO, FSTF 27


Constructeur
 Exemple
#include<iostream.h>
class point {
int x;
int y;

public:
point(int,int);

void deplace(int,int);
void affiche();
};

2011-2012 LST INFO, FSTF 28


Constructeur
 Exemple
point::point(int abs,int ord)
{
x=abs;
y=ord;
}

void point::deplace(int dx,int dy)


{
x+=dx;
y+=dy;
}

void point::affiche()
{
cout << "position :" <<x <<"," <<y <<"\n";
}

2011-2012 LST INFO, FSTF 29


Constructeur
 Exemple
void main()
{
point a(10,20),b(30,30);
point c; // erreur
a.affiche();
a.deplace (5,5);
a.affiche();
b.affiche();
}

2011-2012 LST INFO, FSTF 30


Constructeur
 Exemple: membres données dynamiques

#include<iostream>
using namespace std;

class dvecteur {
int dim;
float *V;

public:
dvecteur(int,float*);
void decaler(float);
void afficher();
};

2011-2012 LST INFO, FSTF 31


Constructeur
 Exemple: membres données dynamiques
dvecteur::dvecteur (int n,float *T)
{
dim=n;
V= new float[dim];
for(int i=0;i<dim;i++) V[i]=T[i];
}

void dvecteur::decaler(float d)
{

for(int i=0;i<dim;i++) V[i] += d;

void dvecteur::afficher()
{
for(int i=0;i<dim;i++) cout << V[i] <<" \n" ;
}
2011-2012 LST INFO, FSTF 32
Constructeur
 Exemple: membres données dynamiques
int main()
{
float t1[]={1,1,1}, t2[]={2,2,2,2};
dvecteur V1(3,t1),V2(4,t2);
V2 = V1;
V2.afficher();
V1.decaler(5);
V2.afficher();
return 0;
}

2011-2012 LST INFO, FSTF 33


Constructeur de recopie
 Initialise
l’objet lors de sa déclaration
par un autre objet
P_existant P_nouveau

Mamouni Mamouni

Mustapha Mustapha

C67965 C67965

2011-2012 LST INFO, FSTF 34


Constructeur de recopie
 Caractéristiques
 Porte le nom de la classe

 N’a pas de type de retour

 A un seul paramètre : une référence à un


objet

 Est facultatif
 S’il n’est pas défini le compilateur génère un constructeur
par défaut

 Ne peut pas être surdéfini


2011-2012 LST INFO, FSTF 35
Constructeur de recopie
 Syntaxe
nomclasse :: nomclasse (nomclasse&) { …}
 Est appelé implicitement lors des situations
suivantes:
 Déclaration initialisation
nomclasse nouveau_objet=objet_existant;
 Passage par valeur d’un objet en paramètre
f( nomclasse objet)

 Retour d’un objet déjà existant par une


fonction
return objet_existant;

2011-2012 LST INFO, FSTF 36


Constructeur de recopie
 Exemple
#include<iostream>
using namespace std;

class point {
int x;
int y;

public:
point(int,int);
point(point&);
void deplace(int,int);
void affiche();
};

2011-2012 LST INFO, FSTF 37


Constructeur de recopie
 Exemple
point::point(int abs,int ord)
{
x=abs;
y=ord;
}

point::point(point &p)
{
x=p.x;
y=p.y;
}

void point::deplace(int dx,int dy)


{
x+=dx;
y+=dy;
}

2011-2012 LST INFO, FSTF 38


Constructeur de recopie
 Exemple

void point::affiche()
{
cout << "position :" <<x <<"," <<y <<"\n";
}
void f(point p)
{
p.affiche();

}
point g()
{

point h(1,1);
return h;
}
2011-2012 LST INFO, FSTF 39
Constructeur de recopie
 Exemple
Int main()
{
point a(10,20);
point c=a;
c.affiche();
c.deplace (5,5);
cout << "ici la fonction f" << endl;
f(c);
cout << "ici la fonction g" << endl;
c = g();
c.affiche();
return 0;
}

2011-2012 LST INFO, FSTF 40


Constructeur de recopie
 Problèmes
lorsqu’une classe contient des
membres données dynamiques

 Risque d’incohérence

 Les deux objets (initial et la copie) se


partageront une même zone mémoire

 La modification des données de l’un affectera


l’autre

2011-2012 LST INFO, FSTF 41


Constructeur de recopie
 Exemple: membres données dynamiques
#include<iostream>
using namespace std;

class dvecteur {
int dim;
float *V;

public:
dvecteur(int,float*);
dvecteur(dvecteur&);
void decaler(float);
void afficher();
};

2011-2012 LST INFO, FSTF 42


Constructeur de recopie
 Exemple: membres données dynamiques
dvecteur::dvecteur (int n,float *T) void dvecteur::decaler(float d)
{ {
dim=n;
V= new float[dim]; for(int i=0;i<dim;i++)
for(int i=0;i<dim;i++) V[i]=T[i];
V[i] += d;
}
dvecteur::dvecteur (dvecteur& vect)
{ }
dim=vect.dim;
V= new float[dim]; void dvecteur::afficher()
for(int i=0;i<dim;i++) {
V[i]=vect.V[i]; for(int i=0;i<dim;i++)
} cout << V[i] <<" \n" ;
}

2011-2012 LST INFO, FSTF 43


Constructeur de recopie
 Exemple: membres données dynamiques
int main()
{
float t1[]={1,1,1};
dvecteur V1(3,t1);
dvecteur V2 = V1;
V2.afficher();
V1.decaler(5);
V2.afficher();
return 0;
}

2011-2012 LST INFO, FSTF 44


Destructeur
 Fonction membre qui a pour Rôle

 Libération des ressources de l’objet à


la fin de son utilisation

 Libération de la zone mémoire allouée


par un constructeur

2011-2012 LST INFO, FSTF 45


Destructeur
 Caractéristiques

 Porte le nom de la classe précédé par le


caractère ~

 N’a pas de paramètres

 N’a pas de type de retour

 Ne peut pas être surdéfini

2011-2012 LST INFO, FSTF 46


Destructeur
 Exemple
#include<iostream>
using namespace std;

class dvecteur {
int dim;
float *V;

public:
dvecteur(int,float*);
dvecteur(dvecteur&);
~dvecteur();
void decaler(float);
void afficher();
};

2011-2012 LST INFO, FSTF 47


Destructeur
 Exemple
dvecteur::dvecteur (int n,float *T)
{ void dvecteur::decaler(float d)
dim=n;
V= new float[dim]; {
for(int i=0;i<dim;i++) V[i]=T[i];
}
dvecteur::dvecteur (dvecteur& vect) for(int i=0;i<dim;i++)
{ V[i] += d;
dim=vect.dim;
V= new float[dim];
for(int i=0;i<dim;i++) }
V[i]=vect.V[i];
}
void dvecteur::afficher()
dvecteur::~dvecteur ()
{ {
dim=0; for(int i=0;i<dim;i++)
delete V;
cout<<"\n Appel du destructeur\n"; cout << V[i] <<" \n" ;
} }

2011-2012 LST INFO, FSTF 48


Destructeur
 Exemple
void scenario(float d)
{
float t1[]={1,1,1};
dvecteur V1(3,t1);

V1.afficher(); V1.decaler(d);
V1.afficher();
}
int main()
{
int d;
for(d=1;d<4;d++)
scenario(d);
return 0;
}

2011-2012 LST INFO, FSTF 49


Constructeur: Exercices
 Définir des constructeurs pour la classe
Rationnel

 Modifier le constructeur qui reçoit deux


paramètres afin d’obtenir un rationnel dans
sa forme irréductible (ajouter les fonctions
nécessaires )

 Ajouter un constructeur de recopie.

2011-2012 LST INFO, FSTF 50


Classe d’allocation static
 Stockage dans la zone statique
 Durée de vie permanente, égale à celle du
programme
 Même portée que les variables automatique
 Initialisation au moment de la compilation,
initialisation par défaut à 0
 Syntaxe
static float x;

2011-2012 LST INFO, FSTF 51


Classe d’allocation static
 Exemple
#include <stdio.h>
void fonct()
{
static int x=0;
int y=0;
printf("x = %d, y = %d\n",x++, y++);
}

Int main()
{
int i ;
for (i=0;i <10; i++)
{
printf(" iteration = %d ", i);
fonct();
}
return 0;
}
2011-2012 LST INFO, FSTF 52
Classe Static et Classes

 Applicable aux méthodes et aux


attributs

 Propriété indépendante de tous les


objets (propriété de la classe)

2011-2012 LST INFO, FSTF 53


Membres données Static

 Lors de la déclaration des objets chaque


objet possède ses propres membres
données

 Exemple
Ob1 Ob2

10 20

15 30

2011-2012 LST INFO, FSTF 54


Membres données Static
 Un membre static est partagé par tous les objets de
la classe
 Syntaxe: Le membre est précédé par le mot clé
static lors de la déclaration de la classe
static type nom_var;

 L’initialisation n’est pas automatique


Type class_name::ident = 0;
Ob1 Ob2
15 20 30

10
Ob3
2011-2012 LST INFO, FSTF 55
Membres données Static
 Exemple
#include<iostream.h> void point::deplace(int dx,int dy)
class point { {
static int nb; x+=dx;
int x; y+=dy;
int y; }
void point::affiche()
public: {
point(int,int); cout << "position :" <<x <<"," <<y
void deplace(int,int); <<"nombre d'objets" << nb <<"\n";
void affiche(); }
}; void main()
int point::nb=0; {
point a(10,20);
point::point(int abs,int ord) a.affiche();
{ a.deplace (5,5);
nb++; a.affiche();
x=abs; point b(30,30);
y=ord; b.affiche();
} }
2011-2012 LST INFO, FSTF 56
Fonctions membres static
 Sont indépendantes de tous les objets
de la classe

 Agissent sur des membres static

 Sont appelées sans référence à un


objet
 référencées directement par le nom de la classe

 nom_classe::fonct_static(…);

2011-2012 LST INFO, FSTF 57


Fonctions membres static
 Peuvent être appelées avant la
création de tout objet

 Syntaxe:
class nom_classe {
….
public:

static type fonct_static(….);
};

2011-2012 LST INFO, FSTF 58


Membres données Static
 Exemple
#include<iostream.h>
class point { void point::deplace(int dx,int dy)
static int nb; {
int x; x+=dx;
int y;
y+=dy;
public: }
point(int,int); void point::affiche()
void deplace(int,int); {
void affiche(); cout << "position :" <<x <<"," <<y
static void compteur(); <<"nombre d'objets" << nb <<"\n";
}; }
int point::nb=0;
void main()
point::point(int abs,int ord) {
{ point a(i,i);
nb++; a.affiche();
x=abs; point::compteur();
y=ord; for(int i=0;i<4;i++)
} senario(i);
void point::compteur()
return 0;
{cout <<"\n nombre de points :"<<nb; }
}
2011-2012 LST INFO, FSTF 59
Surdéfinition
des fonctions membres
 La surdéfinition peut être appliquée aux fonctions
membres d’une classe
 Plusieurs fonctions membres portent le même nom mais
diffèrent dans le contenu selon le type et/ou le nombre de
paramètres
 Sémantiquement ces fonctions font la même action (ex
afficher)
 Le compilateur choisit la fonction à invoquer selon les
paramètres effectifs
 Plus de lisibilité : pas besoin de chercher plusieurs
identificateurs pour la même action

2011-2012 LST INFO, FSTF 60


Surdéfinition
des fonctions membres
 Exemple
#include<iostream.h> void point::initialise(int abs,int ord)
class point { {
x=abs;
int x; y=ord;
int y; }
public: void point::initialise(int c)
{
void initialise(int,int); x=c;
void initialise(int); y=c;
}
void initialise (); void point::initialise()
void deplace(int,int); {
x=100;
void affiche();
y=100;
}; }

2011-2012 LST INFO, FSTF 61


Paramètres par défaut
des fonctions membres
 Une fonction membre peut attribuer des valeurs
par défaut à certains paramètres omis lors de
l’appel
 Seuls les derniers paramètres peuvent avoir des
valeurs par défaut
 ≠ surdéfinition des fonctions :
 Une seule fonction

 !!! Attention risque d’ambiguïté avec la


surdéfinition

2011-2012 LST INFO, FSTF 62


Paramètres par défaut
des fonctions membres
 Exemple
class point {
int x;
int y;
public:
void initialise(int =10,int =10);
void deplace(int,int);
void affiche();
};
void point::initialise(int abs,int ord)
{
x=abs;
y=ord;
}
2011-2012 LST INFO, FSTF 63
Fonctions amies
 Une fonction amie est une fonction non membre
d’une classe et possédant le droit d’accès aux
membres privés de ses objets.

 Intérêt : résoudre certains problèmes de


communication entre objets
 Fonction qui a besoin, dans certains cas, d’accéder
aux membres privés de deux classes différentes
 Attention !! : Violation du concept d’encapsulation
 L’amitié est déclarée par le mot clé friend
2011-2012 LST INFO, FSTF 64
Fonctions amies
 Fonction indépendante et amie d’une classe
 Syntaxe
class A {

public:

friend type_retour fonct_amie(…);

};
// définition de la fonction amie
type_retour fonct_amie(…)
{

}
2011-2012 LST INFO, FSTF 65
Fonctions amies
 Fonction indépendante et amie d’une classe

 Remarque

// Attention !!!! Fausse définition


type_retour A::fonct_amie(…)
{

}

2011-2012 LST INFO, FSTF 66


Fonctions amies
 Fonction membre d’une classe A et amie d’une ou
plusieurs classes
 Syntaxe
class A {

public:

type_retour fonct_amie(…);

};
class B {

public:

friend type_retour A::fonct_amie(…);
};
2011-2012 LST INFO, FSTF 67
Fonctions amies
 Toutesles fonctions membres d’une classe A
sont amies d’une autre classe B
 Syntaxe
class A {

public:

};
class B {

public:

friend class A; // les fonctions membres sont amies de
classe B
};
2011-2012 LST INFO, FSTF 68
Fonctions amies
 Exemple 1
class point { class complexe {
int x; int x;
int y; int y;
public:
public: complexe(int,int);
point(int,int); int coincide(point&);
void deplace(int,int); void affiche();
friend int :complexe::coincide(point&); …
void affiche(); };
};

2011-2012 LST INFO, FSTF 69


Fonctions amies
 Exemple 2
class point { class complexe {
int x; int x;
int y; int y;
public:
complexe(int,int);
public:
int coincide(point&);
point(int,int);
friend int coincide(complexe&,point&);
void deplace(int,int);
void affiche();
friend int coincide(complexe&, point&); …
void affiche(); };
};

2011-2012 LST INFO, FSTF 70


Surcharge des opérateurs
 Opérateur?

 Opération entre des opérandes.

 Un appel à un opérateur est similaire à un


appel de fonctions.

A Op B se traduit par A.fonction(B)

 Exemples

 a+b a.somme(b)
 a=b a.affectation(b)
 ++a a.incrementation()

2011-2012 LST INFO, FSTF 71


Surcharge des opérateurs
 Alternative aux fonctions

 Utilisation plus naturelle que les fonctions


 Exemple : somme de deux complexes c1 et c2
 c3 = c1 + c2 au lieu de c3=c1.somme(c2)

 Généraliser la sémantique d’un opérateur de


type de base aux nouveaux types utilisateurs
(nouvelles classes)

 Donner une nouvelle sémantique à un opérateur

2011-2012 LST INFO, FSTF 72


Surcharge des opérateurs
 Opérateurs à surcharger

 Opérateurs arithmétiques
+-*/ %

 Opérateurs d’incrémentation/décrémentation
++, --

 Opérateurs de comparaison
< > >= <= == !=

 Opérateur d’affectation
=
…
2011-2012 LST INFO, FSTF 73
Surcharge des opérateurs
 Quelques opérateurs non surchargeables
 . Opérateur pointeur vers un membre via objet

 * Opérateur pointeur vers un membre via objet

 :: Opérateur de résolution de portée

 ?: Opérateur conditionnel ternaire

 Sizeof Opérateur déterminant la taille en octets

2011-2012 LST INFO, FSTF 74


Surcharge des opérateurs

 Un opérateur peut être surchargé comme:

 Fonction membre

 Fonction indépendante (fonction amie)

2011-2012 LST INFO, FSTF 75


Surcharge des opérateurs
 Syntaxe

 Comme la définition des fonctions, sauf on


rajoute devant l’opérateur le mot clé
operator

type_retour classe :: operator op([parm1],…)


{

}
2011-2012 LST INFO, FSTF 76
Surcharge des opérateurs
 Exemple
#include<iostream.h> complexe complexe::operator+(complexe& c)
class complexe { {
int reel;
int img; complexe z;
public: z.reel=reel+c.reel;
void saisir(int,int); z.img=img+c.img;
complexe operator+ (complexe &); return z;
void affiche_complexe();
}
};
void complexe::saisir(int r,int i) void main()
{ {
reel=r;
img=i; complexe z1,z2,z3;
} z1.saisir(1,1);
z2.saisir(2,2);
z3=z1+z2;
void complexe::affiche_complexe()
{ z3.affiche_complexe();
cout << " partie réelle :" << reel
cout <<", partie imaginaire :" <<img <<"\n"; }
}

2011-2012 LST INFO, FSTF 77


Surcharge des opérateurs
 Surcharge de l’opérateur d’affectation

 L'opérateur
d'affectation est surchargé
comme une fonction membre.

 L’opérateur d'affectation stocke le résultat


dans l'objet appelant et retourne une
référence sur cet objet.

2011-2012 LST INFO, FSTF 78


Surcharge des opérateurs
 Surcharge de l’opérateur d’affectation
class rationnel {
int a,b;
public:
rationnel & operator=(const rationnel &)
};

rationnel& rationnel::operator=(const rationnel & r)


{
a = r.a; b = r.b;
return *this;
}
2011-2012 LST INFO, FSTF 79
Organisation du code
 Pour une meilleure réutilisabilité, il est
préférable d’organiser le code en trois fichiers:
 Le premier fichier en-tête qui contient la déclaration de la
classe
 nom_classe.h

 Le deuxième fichier qui contient la définition des fonctions


membres de la classe

 Le troisième fichier correspond au programme principal

 Dans le 2ème et 3ème fichier on doit inclure le fichier en-tête


nom_class.h
2011-2012 LST INFO, FSTF 80
Organisation du code
 Exemple
#include<iostream.h>
#include<string.h>
class personne {
char nom[20];
char prenom[20];
int CIN;
public:
void saisir(char*,char*,int);
void afficher();
};

void personne::saisir(char *n,char *p, int numero)


{
strcpy(nom,n);
strcpy(prenom,p);
CIN=numero;
}

2011-2012 LST INFO, FSTF 81


Organisation du code
 Exemple
void personne::afficher()
{
cout <<"nom : " <<nom<<"\n";
cout <<"prenom : " <<prenom<<"\n";
cout <<"CIN : " <<CIN<<"\n";
}

void main()
{
personne p;
p.saisir("dupont","pascal",11111);
p.afficher();
}

2011-2012 LST INFO, FSTF 82


Organisation du code
 Exemple: fichier en-tête « personne.h »

class personne {
char nom[20];
char prenom[20];
int CIN;
public:
void saisir(char*,char*,int);
void afficher();
};

2011-2012 LST INFO, FSTF 83


Organisation du code
 Exemple: fichier définition des fonctions membres
« p1.h »
void personne::saisir(char *n,char *p, int numero)
{
strcpy(nom,n);
strcpy(prenom,p);
CIN=numero;
}
void personne::afficher()
{
cout <<"nom : " <<nom<<"\n";
cout <<"prenom : " <<prenom<<"\n";
cout <<"CIN : " <<CIN<<"\n";
}

2011-2012 LST INFO, FSTF 84


Organisation du code
 Exemple: fichier programme principale « p2.h »

void main()
{
personne p;
p.saisir("dupont","pascal",11111);
p.afficher();
}

2011-2012 LST INFO, FSTF 85

Vous aimerez peut-être aussi

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy