Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Mohammed OUANAN
1
Plan
Structures
Classes
Droit d’accès aux membres
Définition des fonctions membres
Instances de classe
2
Les structures
3
Les structures
Exemple
Point a,b;
a.x=10;
a.y=20; équivalent à a.initialise(10,20)
4
Les structures
Exemple
#include<iostream.h>
struct point { int x;
void main()
int y;
void initialise(int,int); {
void deplace(int,int); point a,b;
void affiche(); a.initialise (10,20);
}; a.affiche();
void point::initialise(int abs,int ord) a.deplace (5,5);
{ a.affiche();
x=abs; b.x=1;
y=ord;
b.y=1;
}
void point::deplace(int dx,int dy) b.affiche();
{ }
x+=dx;
y+=dy;
}
void point::affiche()
{
cout << "position :" <<x <<"," <<y <<"\n";
}
5
Notion de classe
6
Notion de classe
Exemple
7
Classes
Droit d’accès aux membres
Private :
Seules les méthodes de la classe peuvent accéder au
membre "privé"
8
Classes
Droit d’accès aux membres
9
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:
float calculer();
};
10
Classes
Définition des fonctions membres
Syntaxe
Type nom_classe :: nom_fonction (type param,…)
{
…
}
11
Classes
Exemple d’utilisation
#include<iostream.h>
int y;
public:
void initialise(int,int);
void deplace(int,int);
void affiche();
};
12
Classes
Exemple d’utilisation
void point::affiche()
{
cout << "position :" <<x <<"," <<y <<"\n";
}
13
Classes
Instances de classe : objets
Affectation d’objets
ob2 = ob1;
Copie les valeurs des membres données de ob1 dans ob2
14
Classes
Exemple d’utilisation
void main()
{
point a,b;
a.initialise (10,20);
a.affiche();
}
15
Constructeur / Destructeur
16
Constructeur
17
Constructeur
Caractéristiques :
Est facultatif
18
Constructeur
Caractéristiques:
Syntaxe :
Nom_classe::Nom_classe([param1,…]) {…}
Nom_classe ob2(val);
Nom_classe ob3;
19
Constructeur : exemple (1)
#include<iostream.h>
class point { int x;
int y;
public:
point(int,int);
void deplace(int,int);
void affiche();
};
20
Constructeur : exemple (1)
void point::affiche()
{
cout << "position :" <<x <<"," <<y <<"\n";
}
21
Constructeur : exemple (1)
void main()
{
point a(10,20),b(30,30);
point c; // erreur
a.affiche();
a.deplace (5,5);
a.affiche();
b.affiche();
}
22
Constructeur avec argument par défaut
23
Constructeur : exemple (2)
Allocation dynamique
#include<iostream.h>
class jours_travail { int nb_jour;
int *T;
public:
jours_travail(int);
void ajoute(int);
void supprime(int);
void affiche();
};
24
Constructeur : exemple (2)
Allocation dynamique
jours_travail::jours_travail (int n) void jours_travail::supprime(int j)
{ {
nb_jour=n; int *T1,k=0;
T= new int[n]; T1=new int[nb_jour-1];
for(int i=0;i<nb_jour;i++) for(int i=0;i<nb_jour;i++)
T[i]=i; if (T[i]!= j) {
}
T1[k]=T[i];
void jours_travail::ajoute(int j)
k++; }
{ nb_jour--;
int *T1; delete T;
T1=new int[nb_jour+1]; T=T1;
for(int i=0;i<nb_jour;i++) }
T1[i]=T[i];
T1[nb_jour]=j; void jours_travail::affiche()
nb_jour++; {
delete T;
for(int i=0;i<nb_jour;i++)
T=T1;
cout << T[i] <<" \n" ;
}
}
25
Constructeur : exemple (2)
Allocation dynamique
void main()
{
jours_travail cal(3);
cal.ajoute(5);
cal.supprime(1);
cal.affiche();
}
26
Destructeur
27
Destructeur
Caractéristiques
Porte le nom de la classe précédé par le
caractère ~
28
Destructeur : exemple
#include<iostream.h>
class jours_travail { int nb_jour;
int *T;
public:
jours_travail(int);
~jours_travail();
void ajoute(int);
void supprime(int);
void affiche();
};
29
Destructeur : exemple
#include<iostream.h> void jours_travail::ajoute(int j)
jours_travail::jours_travail (int n) {
int *T1;
{
T1=new int[nb_jour+1];
nb_jours=n; for(int i=0;i<nb_jour;i++)
T= new int[n]; T1[i]=T[i];
for(int i=0;i<nb_jour;i++) T1[nb_jour]=j;
T[i]=i; nb_jour++;
} delete T;
T=T1;
jours_travail::~jours_travail () }
{ void jours_travail::supprime(int j)
nb_jour=0; {
delete T; int *T1,k=0;
} T1=new int[nb_jour-1];
for(int i=0;i<nb_jour;i++)
void jours_travail::affiche() if (T[i]!= j) {
{ T1[k]=T[i];
for(int i=0;i<nb_jour;i++) k++; }
nb_jour--;
cout << T[i] <<" \n" ; delete T;
} T=T1;
30 }
Destructeur : exemple
void scenario(int j)
{
jours_travail cal(j);
cal.ajoute(j+1);
cal.affiche();
}
void main()
{
for(int =1; i<5; i++)
scenario(i);
}
31
Affectation des objets
32
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
33
Constructeur de recopie
Syntaxe :
nomclasse :: nomclasse (nomclasse&) { …}
34
Constructeur de recopie : exemple (1)
#include<iostream.h>
class point { int x;
int y;
public:
point(int,int);
point(point&);
~point();
void deplace(int,int);
void affiche();
};
35
Constructeur de recopie : exemple (1)
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;
}
void point::affiche()
{
cout << "position :" <<x <<"," <<y <<"\n";
}
36
Constructeur de recopie : exemple (1)
void main()
{
point a(10,20);
point c=a;
c.affiche();
c.deplace (5,5);
c.affiche();
}
37
Constructeur de recopie : exemple (2)
Allocation dynamique
#include<iostream.h>
class jours_travail { int nb_jour;
int *T;
public:
jours_travail(int);
jours_travail(jours_travail &);
~jours_travail();
void ajoute(int);
void supprime(int);
void affiche();
};
38
Constructeur de recopie : exemple (2)
Allocation dynamique
#include<iostream.h> void jours_travail::ajoute(int j)
jours_travail::jours_travail (int n) {
{ int *T1;
nb_jours=n; T1=new int[nb_jour+1];
T= new int[n]; for(int i=0;i<nb_jour;i++)
for(int i=0;i<nb_jour;i++)
T1[i]=T[i];
T[i]=i;
} T1[nb_jour]=j;
nb_jour++; delete T;
jours_travail::jours_travail (jours_travail & T=T1;
cal) }
{
nb_jour=cal.nb_jour; void jours_travail::supprime(int j)
T= new int[nb_jour]; {
for(int i=0;i<nb_jour;i++) int *T1,k=0;
T[i]=cal.T[i]; T1=new int[nb_jour-1];
} for(int i=0;i<nb_jour;i++)
if (T[i]!= j) {
void jours_travail::affiche() T1[k]=T[i];
{ k++; }
for(int i=0;i<nb_jour;i++) nb_jour--;delete T;
cout << T[i] <<" \n" ;
T=T1;
}
}
39
Constructeur de recopie : exemple (2)
Allocation dynamique
jours_travail::~jours_travail ()
{
nb_jour=0; void main()
delete T; {
}
jours_travail cal(3);
cal.ajoute(5);
cal.supprime(1);
Jours_travail cal1=cal;
cal1.ajoute(4);
cal1.affiche();
}
40
Type d’objets et leurs durée de vie
41
Classe d’allocation static
Stockage dans la zone statique
Syntaxe:
static float x;
42
Classe d’allocation static
Exemple
#inlude <stdio.h>
void fonct()
{
static int x=0;
int y=0;
printf(“x = %d, y = %d\n”,x++, y++);
}
main()
{
int i ;
for (i=0;i <10; i++)
{
printf(’’ iteration = %d ’’, i)
fonct();
}
}
43
Classe Static et Classes
44
Les membres données
Classe de stockage static
Exemple :
Ob1 Ob2
10 20
15 30
45
Les membres données
Classe de stockage static
Ob1 Ob2
15 20 30
10
46
Ob3
Les membres données static
Exemple 1
void point::deplace(int
#include<iostream.h> 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
void affiche(); <<"," <<y <<"nombre d'objets"
}; << nb <<"\n";
int point::nb=0; }
void main()
point::point(int abs,int ord) {
{ point a(10,20);
nb++; a.affiche();
x=abs; a.deplace (5,5);
y=ord; a.affiche();
} point b(30,30);
b.affiche();
}
47
membre static
Exemple 2
class UneClasse
{
// private:
static long a;
public:
static long b;
void UneMéthode(){ a=2;b=3; }
};
long UneClasse::a = 5; // initialisation de a
long UneClasse::b = 6; // initialisation de b
void f()
{
UneClasse::a = 8;// erreur de compilation:
//a est privé
UneClasse::b = 9 ;
48
}
Les propriétés d’une variable statique dans une méthode
Exemple 3
class UneClasse
{ public:
long Increment()
{
static long a=0;//a vaut 0 lors du premier
//appelde la méthode Increment()
a++;
return a; }
};
int main() {
UneClasse classe1, classe2;
long aa = classe1.Increment();//aa vaut 1
aa = classe2.Increment();// aa vaut 2
return 0;
}
49
Les fonctions membres static
nom_classe::fonct_static(…);
50
Les fonctions membres static
Peuvent être appelées avant la création de tout objet
Syntaxe:
class nom_classe{
….
public:
…
static type fonct_static(….);
};
51
Exemple 4:
class UneClasse
{
public:
static long a;
long b;
static void Increment()
{
a++;
b++;// erreur de compilation:
//ne peut accéder à un attribut non-statique
}
};
long UneClasse::a = 0;
void f()
{
UneClasse::Increment();//appel à la fonction
//statique
}
52
Les fonctions membres constantes
53
Les fonctions membres constantes
Exemple et syntaxe:
class UneClasse
{
public:
long m_Attribut;
void MaMéthode() const; //l’entete
//(prototype de la méthode)
};
void UneClasse::MaMéthode()const //décalaration
//de la méthode
{
m_Attribut++;// erreur de compilation :
// la méthode est constante
}
54
Les fonctions membres constantes
Remarques:
le terme const doit figurer à la fois dans la déclaration de la
fonction et dans l’entête de cette fonction.
55
Surdéfinition des fonctions membres
56
Surdéfinition des fonctions membres
57
Surdéfinition des fonctions membres
void main()
{
point a,b,c;
a.initialise(1,2);
b.initialise(3);
c.initialise();
a.affiche();
b.affiche();
}
58
Paramètres par défaut des fonctions membres
Une fonction membre peut attribuer des valeurs par défaut a certains
Seuls les derniers paramètres peuvent avoir des valeurs par défaut
59
Paramètres par défaut des fonctions membres
Exemple
class point { int x;
void main()
int y; {
public: point a,b,c;
void initialise(int =0,int =0); a.initialise(1,2);
void deplace(int,int); b.initialise(3);
void affiche(); c.initialise();
}; a.affiche();
void point::initialise(int abs=0,int ord=0) b.affiche();
{
x=abs; }
y=ord;
}
60
Le pointeur this
Dans toutes les méthodes (non statiques) de toutes les classes, C++
défini automatiquement un pointeur nommé this (auto référence). C’est
un pointeur, du type de la classe, qui pointe vers l’objet courant. Il est
utilisé lorsque aucun autre nom d’objet n’a été spécifié.
61
Le pointeur this: Exemple
class UneClasse; // déclaration de la classe
class UneClasse
{
long m_Attribut;
int x;
int y;
public: UneClasse(int, int) ;
void UneMethode (long) ;
};
Communiquer l’ accès à une entité extérieur à la classe.
void UneClasse:: UneMethode (long a)
{
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.
Fonction qui a besoin, dans certains cas, d’accéder aux membres privés
de deux classes différentes
Syntaxe:
Class A {
…
Public:
…
friend type_retour fonct_amie(…);
…
};
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(…);
};
67
Fonctions amies
Exemple2: Fonctions membre d’une classe amie d’une autre classe
class A; // déclaration de la classe A
class B { // définition de la classe B.
public :
void afficher (A&);
};
class A { // définition de la classe A
int i;
public :
A (int e=10){ i=e;}
friend void B::afficher (A &);
};
void B::afficher( A & a) {
cout << a.i << endl; // afficher a accès au champ privé i
de la classe A
}
void main() {
A x1(5);
A x2;
B y;
y.afficher(x1); // en sortie 5
y.afficher(x2); // en sortie 10
}
68
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 sont amies de
//la classe B
};
69
Fonctions amies
fonction amie de plusieurs classes:
class A;
class B {
int j;
public :
B (int w=15){j=w; }
friend void afficher (A&, B&);//afficher amie de A et B.
};
class A {
int i;
public :
A (int e=10){i=e; }
friend void afficher (A&, B&);//afficher amie de A et B.
};
70
Fonctions amies
Exemple 3
class point { int x;
class complexe { int x;
int y;
int y;
public: public:
point(int,int); complexe(int,int);
void deplace(int,int); int coincide(point&);
void affiche();
friend int complexe::coincide(point&);
…
void affiche(); };
};
71
Fonctions amies
Exemple 4
class point { int x;
int y; class complexe { int x;
int y;
public:
public:
point(int,int);
complexe(int,int);
void deplace(int,int); friend int coincide(complexe&,point&);
friend int coincide(complexe&,point&); void affiche();
void affiche(); };
};
72
Surcharge des opérateurs
Opérateur?
Opération entre des opérandes.
Exemples
a+b a.operator+(b)
b+a b.operator+(a)
a=b a.operator=(b)
73
++a a.operator++()
Surcharge des opérateurs
Surcharge?
Redéfinition d’une fonction avec le même nom mais pas avec les
mêmes paramètres.
Pour les opérateurs :
sont définis uniquement pour les types de base (int, float, etc.)
surcharge = redéfinition avec des opérandes de type class.
Intérêt : utilisation plus naturel pour certaines classes
Pour l’exemple de la classe point:
class point {...};
point a, b, c;
Il est plus naturel d’écrire a = b + c;
que d’écrire a = b.addition(c)
74
Surcharge des opérateurs
On ne peut surcharger que les opérateurs qui existent déjà. On
ne peut pas en inventer!
75
Surcharge des opérateurs
76
Surcharge des opérateurs
77
Surcharge des opérateurs
78
Exemple: l’opérateur d’adition
#include<iostream.h>
class point { int x; void main()
int y; {
point a(1.2),b(2,3),c(0,0);
Public:
point(int,int); c=a+b ;//c=a.operator
+(b) ;
void deplace(int,int);
void affiche(); c=a+b+c;//c=(a.operator+
point(); (b)).operator+(c) ;
Point operator +(Point) ; c.affiche();
}; }
Point Point:: operator +(Point a)
{ Point res;
res.x=x+a.x ;
res.y=y+a.y ;
return res ;
}
79
Surcharge de l’affectation
Le problème déjà résolu par le constructeur par recopie est
comparable a celui posé dans le cas d’affectation entre objets
d’une classe. Mais, dans ce deuxième cas, on distingue la
situation suivante : (b=a)