Chapitre3 Classes PR Ouatik
Chapitre3 Classes PR Ouatik
Chapitre3 Classes PR Ouatik
Objets
Chapitre 3
Classes et Objets
2011-2012 2
Notion de classe
Généralisation de la notion de type
Réunir données et traitement dans la même
entité
2011-2012 3
Notion de classe
Exemple
class point {
int x;
int y;
public:
void initialise(int,int);
void deplace(int,int);
void affiche();
};
2011-2012 4
Classes
Droit d’accès aux membres
Private
– Seules les méthodes de la classe peuvent accéder
au membre "privé"
2011-2012 5
Classes
Droit d’accès aux membres
2011-2012 6
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 7
};
Classes
2011-2012 10
Classes
Instances de classe : objets
Affectation d’objets:
Risque d’incohérence
2011-2012 11
Classes
Exemple
#include<iostream>
class point {
int x;
int y;
public:
void initialise(int,int);
void deplace(int,int);
void affiche();
2011-2012 }; 12
Classes
Exemple
void point::initialise(int abs, int ord)
{
x=abs;
y=ord;
}
void point::affiche()
{
cout << "position :" <<x <<"," <<y <<"\n";
}
2011-2012 13
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 14
Classes
Instances de la 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 15
Classes
Instances de la 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 } 16
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();
}
2011-2012 17
Classes
Exercice
2011-2012 19
Constructeur
Initialiseles membres données de l’objet
lors de sa déclaration par:
Les valeurs passées en paramètres
Est facultatif
S’il n’est pas défini le compilateur génère un constructeur
par défaut
2011-2012 21
Constructeur
Caractéristiques
Syntaxe
nom_classe::nom_classe([param1,…]) {…}
2011-2012 22
Constructeur
Caractéristiques
Objets automatiques
nom_classe ob1(val1,val2);
nom_classe ob2(val);
nom_classe ob3;
Objets dynamiques
2011-2012 23
Constructeur
Exemple
#include<iostream.h>
class point {
int x;
int y;
public:
point(int,int); // constructeur
void deplace(int,int);
void affiche();
};
2011-2012 24
Constructeur
Exemple
point::point(int abs, int ord)
{
x=abs;
y=ord;
}
void point::affiche()
{
cout << "position :" <<x <<"," <<y <<"\n";
}
2011-2012 25
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 26
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 27
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 28
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 29
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 30
Constructeur de recopie
Caractéristiques
Porte le nom de la classe
Est facultatif
S’il n’est pas défini le compilateur génère un constructeur
par défaut
2011-2012 31
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)
2011-2012 32
Constructeur de recopie
Exemple
#include<iostream>
using namespace std;
class point {
int x;
int y;
public:
point(int,int);
point(point&); // constructeur de recopie
void deplace(int,int);
void affiche();
};
2011-2012 33
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::affiche()
{
cout << "position :" <<x <<"," <<y <<"\n";
}
void f(point p)
{
p.affiche();
}
point g()
{
point h(1,1);
return h;
}
2011-2012 35
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 } 36
Constructeur de recopie
Problèmes lorsqu’une classe contient des membres
données dynamiques
Risque d’incohérence
2011-2012 37
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 38
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 39
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 40
Destructeur
Fonction membre qui a pour Rôle
2011-2012 41
Destructeur
Caractéristiques
2011-2012 42
Destructeur
Exemple
#include<iostream>
using namespace std;
class dvecteur {
int dim;
float *V;
public:
dvecteur(int,float*);
dvecteur(dvecteur&);
~dvecteur(); // destructeur
void decaler(float);
void afficher();
};
2011-2012 43
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];
} for(int i=0;i<dim;i++)
dvecteur::dvecteur (dvecteur& vect) 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 () for(int i=0;i<dim;i++)
{
dim=0; cout << V[i] <<" \n" ;
delete V; }
cout<<"\n Appel du destructeur\n";
}
2011-2012 44
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 45
Constructeur: Exercices
Définir des constructeurs pour la classe
Rationnel
2011-2012 46
Le Qualificatif 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 47
Le Qualificatif 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 48
Attributs et Méthodes static
Exemple
Ob1 Ob2
10 20
15 30
2011-2012 50
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;
10
Ob3
2011-2012 51
Membres données Static
Exemple
#include<iostream.h> void point::deplace(int dx,int dy)
class point { {
static int nb;
int x; x+=dx;
int y; y+=dy;
}
public: void point::affiche()
point(int,int); {
void deplace(int,int); cout << "position :" <<x <<"," <<y
void affiche(); <<"nombre d'objets" << nb <<"\n";
}; }
int point::nb=0;
void main()
point::point(int abs,int ord) { point a(10,20);
{ a.affiche();
nb++; a.deplace (5,5);
x=abs; a.affiche();
y=ord; point b(30,30);
} b.affiche();
2011-2012 } 52
Fonctions membres static
Sont indépendantes de tous les objets de
la classe
nom_classe::fonct_static(…);
2011-2012 53
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 54
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(); }
static void compteur();
}; void main()
int point::nb=0; {
point a(i,i);
point::point(int abs,int ord) a.affiche();
{nb++; point::compteur();
x=abs; for(int i=0;i<4;i++)
y=ord; senario(i);
} return 0;
void point::compteur() }
{cout <<"\n nombre de points :"<<nb;
}
2011-2012 55
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 56
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); {
void affiche(); x=100;
y=100;
}; }
2011-2012 57
Paramètres par défaut
des fonctions membres
Unefonction membre peut attribuer des
valeurs par défaut à certains paramètres
omis lors de l’appel
2011-2012 58
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 59
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.
Remarque
2011-2012 62
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 63
Fonctions amies
Toutes les 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 de A sont amies de
classe B
};
2011-2012 64
Fonctions amies
Exemple 1
class point { class complexe {
int x; int x;
int y; int y;
public:
complexe(int,int);
public:
int coincide(point&);
point(int,int);
void affiche();
void deplace(int,int);
…
friend int complexe::coincide(point&); };
void affiche();
};
2011-2012 65
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 66
Surcharge des opérateurs
Opérateur?
Exemples
a+b a.somme(b)
a=b a.affectation(b)
++a a.incrementation()
2011-2012 67
Surcharge des opérateurs
Alternative aux fonctions membre
Opérateurs arithmétiques
+-*/ %
Opérateurs d’incrémentation/décrémentation
++, --
Opérateurs de comparaison
< > >= <= == !=
Opérateur d’affectation
=
…
2011-2012 69
Surcharge des opérateurs
Quelques opérateurs non surchargeables
. Opérateur pointeur vers un membre via objet
2011-2012 70
Surcharge des opérateurs
Fonction membre
2011-2012 71
Surcharge des opérateurs
Syntaxe
2011-2012 72
Surcharge des opérateurs
Exemple
#include<iostream.h> complexe complexe::operator+(complexe & c)
class complexe { {
int reel; complexe z;
int img;
public: z.reel=reel+c.reel;
void saisir(int,int); z.img=img+c.img;
complexe operator+ (complexe &); return z;
void affiche(); }
};
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);
void complexe::affiche() z3=z1+z2;
{
cout << " partie réelle :" << reel z3.affiche();
cout <<", partie imaginaire :" <<img
<<"\n"; }
}
2011-2012 73
Surcharge des opérateurs
Surcharge de l’opérateur d’affectation
L'opérateur
d'affectation est surchargé
comme une fonction membre.
2011-2012 74
Surcharge des opérateurs
Surcharge de l’opérateur d’affectation
class rationnel {
int a,b;
public:
rationnel & operator=(const rationnel &)
};
2011-2012 76
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();
};
2011-2012 77
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 78
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 79
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 80
Organisation du code
Exemple: fichier programme principale « p2.cpp »
void main()
{
personne p;
p.saisir("dupont","pascal",11111);
p.afficher();
}
2011-2012 81