Académique Documents
Professionnel Documents
Culture Documents
ENSI - II1
Chapitre 4 : Les Classes en C++ A.U. : 2012/2013
CHAPITRE 4
Plan
2
type_retour Nom_Classe::nom_methode(paramètres)
{
// corps de la méthode Opérateur de résolution de portée :
La méthode nom_methode de la classe
} nom_classe
Une fois déclarée et définie, une classe peut être utilisée pour
créer des objets (instanciée).
Structure du programme
6
Structure du programme
7
Déclaration
Définition
Utilisation
Exemple
8
//-----------Point.h------------ //---------------Point.cpp----------------
class Point #include <iostream>
{ #include "Point.h"
private: using namespace std;
int x;
int y; void Point::initialiser (int abs, int ord)
{
public: x = abs ;
void initialiser(int, int); y = ord ;
void deplacer(int,int); }
void afficher();
}; void Point::deplacer (int dx, int dy)
{
//----------Main.cpp------------ x = x + dx ;
#include "Point.h" y = y + dy ;
int main() }
{ Point a, b ;
a.initialiser (5, 2) ; Void Point::afficher ()
a.afficher () ; {
a.deplacer (-2, 4) ; cout << "Coordonnées du point : (" << x
a.afficher () ; << ", " << y << ")" << endl ;
b.initialiser (1,-1) ; }
b.afficher () ; }
Structure du programme
9
Une deuxième manière d’organiser le programme
//------------Main.cpp-------------- //----------Main.cpp(suite)-----------
#include <iostream> void Point::deplacer (int dx, int dy)
using namespace std; {
x = x + dx ;
class Point y = y + dy ;
{ }
private:
int x; void Point::afficher ()
int y; {
cout<<"("<<x<<", "<< y<<")"<< endl;
public: }
void initialiser(int, int);
void deplacer(int,int); int main()
void afficher(); {
}; Point a, b ;
a.initialiser (5, 2) ;
void Point::initialiser (int abs, a.afficher () ;
int ord) a.deplacer (-2, 4) ;
{ a.afficher () ;
x = abs ; b.initialiser (1,-1) ;
y = ord ; b.afficher () ;
} }
Structure du programme
10
Une troisième manière d’organiser le programme
//------------Main.cpp-------------- //----------Main.cpp(suite)----------
#include <iostream> void afficher ()
using namespace std; {
cout<<"("<<x<<", "<< y<<")"<<
class Point endl;
{ }
private: };
int x;
int y; int main()
{
public: Point a, b ;
void initialiser(int abs, int ord) a.initialiser (5, 2) ;
{ a.afficher () ;
x = abs ; a.deplacer (-2, 4) ;
y = ord ; a.afficher () ;
} b.initialiser (1,-1) ;
b.afficher () ;
void deplacer (int dx, int dy) }
{
x = x + dx ;
y = y + dy ;
}
Constructeur
13
Il ne retourne rien (pas de mention d’un type de retour, même pas void).
Une classe peut avoir plusieurs constructeurs à condition que les règles
de surcharge soient respectées.
Constructeur
14
//---------Point.h---------- //------------Point.cpp-------------
class Point #include <iostream>
{ #include "Point.h"
private: using namespace std;
int x;
int y; Point::Point(int n)
{
public: x = n;
Point(int); y = n;
Point(int, int); }
...
}; Point::Point(int n, int p)
{
//--------Main.cpp---------- x = n;
#include "Point.h" y = p;
int main() }
{ Point a(3);
Point b(1,2); ...
...
}
Constructeur
15
Dans la classe Point on ne peut plus créer des objets sans passer des
paramètres ( Point p; ) sauf si on définit explicitement un constructeur
qui ne prend pas d’arguments ( Point(); ) .
Point(); // Déclaration
...
Point::Point() // Définition
{
x = 0;
y = 0;
}
...
Point p; // Appel (on n’écrit pas Point p();)
Constructeur
16
Exemple :
Point::Point(int n, int p) : x(n), y(p)
{
//autres instructions
}
Constructeur
17
Un objet peut comporter aussi bien des attributs statiques que des
attributs dynamiques.
Construction d’objets
18
Construction d’objets
19
Objets statiques
Construction d’objets
20
Objets automatiques
Construction d’objets
21
//-------------Main.cpp---------------- //-------Point.h--------
#include "Point.h" class Point
{
private:
Point a; //objet statique
int x;
Point b(3,6); //objet statique int y;
public:
int main() Point();
{ a.afficher(); Point(int);
b.afficher(); Point(int, int);
Point c(5); //objet automatique ...
};
for(int i=1; i<=3; i++)
{ Résultat d’exécution
Point d(i,2*i); //objet automatique (0, 0)
d.afficher(); (3, 6)
(5, 5)
} //destruction de d
(1, 2)
} //destruction de c puis de a et b (2, 4)
(3, 6)
Construction d’objets
22
Objets dynamiques
Construction d’objets
23
//-------------Main.cpp---------------- //-------Point.h--------
#include "Point.h" class Point
int main() {
private:
{
int x;
Point* ptr; //pointeur sur Point int y;
ptr = new Point(0); //objet dynamique
ptr->deplacer(2,3); public:
ptr->afficher(); Point();
Point(int);
...
void afficher();
delete ptr; //destruction de ptr ...
} };
Destructeur
24
Il ne retourne rien (pas de mention d’un type de retour, même pas void)
et ne prend pas de paramètres.
Destructeur
25
Un objet peut comporter aussi bien des attributs statiques que des
attributs dynamiques.
Destructeur
26
//---------Point.h---------- //------------Point.cpp-------------
class Point ...
{ private: Point::Point(int n)
int x; Présence uniquement { x = n;
int y; d’attributs statiques y = n;
public: }
Point(int); Point::~Point() //facultatif
~Point(); //destructeur {
... }
}; ...
//--------Etudiant.h-------- //-----------Etudiant.cpp-----------
class Etudiant ...
{ private: Etudiant::Etudiant(int id, int nb)
int ident; Présence d’un :ident(id), nbNotes(nb)
int nbNotes; attribut { notes = new float[nbNotes];
float* notes; dynamique ! }
public:
Etudiant(int, int); Etudiant::~Etudiant() //indispensable
~Etudiant(); //destructeur { delete[] notes; //libération
... }
}; ...
Destruction d’objets
27
Destruction d’objets
28
//-------------Main.cpp---------------- //-------Point.h--------
... class Point
Point a; //objet statique {
int main() private:
{ a.afficher(); int x;
Point b(5); //objet automatique int y;
for(int i=1; i<=3; i++) public:
{ Point c(i,2*i); //objet automatique Point();
c.afficher(); Point(int);
} //destruction de c Point(int, int);
Point* d = new Point(4, 5); ~Point();
//objet dynamique ...
d->afficher(); };
delete d; //destruction de d
} //destruction de b puis de a
Affectation d’objets
29
Affectation d’objets
30
Affectation d’objets
31
Affectation d’objets
32
a *a : Point
Constructeur de recopie
34
Déclaration :
nomClasse(nomClasse&);
Définition :
nomClasse::nomClasse(nomClasse& obj) : ...
{
//opérations d’allocation de la mémoire
//opérations de copie des attributs dynamiques
}
Utilisation :
Attention !
nomClasse nomClone = nomObjet; Ne pas confondre avec une affectation
d’objets, il s’agit d’une initialisation qui
nomClasse nomClone(nomObjet);
provoque l’appel automatique du
constructeur de recopie.
Constructeur de recopie
35
int main()
{ Etudiant e1(1, 8); Définition du constructeur de recopie.
Etudiant e2(e1); -----------------------------------------------------------------
Etudiant e3 = e1; Ces deux initialisations font appel automatiquement
... au constructeur de recopie qui (tel que défini) effectue
}
une copie profonde (clone) de l’objet e1
Constructeur de recopie
36
e1 : Etudiant e2 : Etudiant
Copie des valeurs
id = 1 id = 1
des attributs
nbNotes = 8 nbNotes = 8
notes = @ ||||||| notes = @’ |||||||
Constructeur de recopie
37
Constructeur de recopie
38
Constructeur de recopie
39
dim = 5 dim = 5
notes = @ | | | | notes = @
Constructeur de recopie
40
Constructeur de recopie
41
A la sortie de la fonction fct(), le paramètre formel a est détruit, ce qui est sans
effet sur le paramètre effectif t !
t : Tab a : Tab
dim = 5 dim = 5
notes = @ | | | | notes = @’ | | | |
Exemple :
class maClasse
{
int n;
float x;
...
};
...
maClasse a, b;
Exemple :
class maClasse
{
static int n;
float x;
...
};
...
maClasse a, b;
Exemple :
class maClasse
{
static int n;
float x;
...
};
int maClasse::n = 5; //initialisation de l’attribut statique
Exemple
Ajouter à la classe Point définie précédemment, un attribut
permettant de compter le nombre de ses instances existantes.
Exemple
Ajouter à la classe Point définie précédemment, une méthode
permettant d’afficher le nombre de ses instances existantes.
Fonctions amies
48
Fonctions amies
49
Pour déclarer une fonction amie d’une classe il suffit d’insérer son
prototype dans la définition de la classe en le faisant précéder
par le mot clé friend.
class maClasse
{ // Attributs
public:
// Méthodes
friend type_retour nom_fonction(arguments);
}
Fonctions amies
50
Exemples
Fonctions amies
51
Remarques
Fonction indépendante amie de plusieurs classes à la fois
Toutes les méthodes d’une classe sont amies avec une autre classe :
pour dire que toutes les fonctions membres de la classe B sont amies de
la classe A, on place dans la classe A, la déclaration
Remarques
Cas de l’opérateur =
Cas de l’opérateur =
Cas de l’opérateur =
#include <iostream>
using namespace std;
class Vecteur
{ int nb; Equivaut à un passage
int* adr; d’arguments par
public : valeur mais évite la
Vecteur(int n)
copie d’arguments et
{ adr = new int[nb=n];
for(int i=0; i<nb; i++) adr[i] = 0; donc le recours au
} constructeur de
~Vecteur() { delete adr; } recopie
Vecteur& operator=(const Vecteur&);
};
Vecteur& Vecteur::operator=(const Vecteur& v)
{ if (this != &v) Retour par référence :
{ delete adr; pour bien gérer les
adr = new int[nb=v.nb] ; affectations multiples
for (int i=0; i<nb; i++) adr[i] = v.adr[i];
(a=b=c)
}
return *this;
}
Remarque importante
class T
{ ...
public :
T (...); //constructeurs
T (const T &); //constructeur de recopie
~T (); //destructeur
T& operator=(const T&); //affectation
};
Généricité
71
Généricité
72
Patron de fonctions
Au lieu d’écrire :
int minimum(int a, int b) float minimum(float a, float b) ...
{ {
if (a < b) return a; if (a < b) return a;
else return b; else return b;
} }
Généricité
73
Patron de fonctions
Généricité
74
Patron de fonctions
#include <iostream>
using namespace std ;
// création d'un patron de fonctions minimum
template <class T> T minimum (T a, T b)
{ if (a < b) return a;
else return b;
}
// exemple d'utilisation du patron de fonctions minimum
main()
{ int n=4, p=12;
float x=2.5, y=3.25;
cout << "minimum(n,p) = " << minimum(n,p) << endl;
// int minimum(int,int)
cout << "minimum(x,y) = " << minimum(x,y) << endl;
// float minimum(float, float)
}
Généricité
75
Patron de fonctions
#include <iostream>
using namespace std ; // exemple d'utilisation
template <class T> T minimum (T a, T b) int main()
{ if (a < b) return a; { Vecteur u(3,2), v(4,1), w;
else return b; w = minimum(u,v);
} cout << "minimum(u,v) = ";
class Vecteur w.affiche() ;
{ int x, y; }
public:
Vecteur(int abs=0, int ord=0) { x=abs; y=ord; }
void affiche() { cout << x << " " << y; }
friend int operator<(Vecteur, Vecteur);
};
int operator<(Vecteur a, Vecteur b)
{ return (a.x*a.x + a.y*a.y < b.x*b.x + b.y*b.y);
}
Généricité
76
Patron de classes
Au lieu d’écrire :
class Point class Point ...
{ int x; int y; { float x; float y;
public: public:
Point(int a=0, int b=0); Point(float a=0, float b=0);
void affiche(); void affiche();
... ...
}; };
Généricité
77
Patron de classes
Le patron de la classe Point est défini comme suit :
template <class T> class Point
{
T x; T y;
public:
Point (T a=0, T b=0);
void affiche();
};
template <class T> void Point<T>::affiche()
{ ...
}
Généricité
78
Patron de classes
#include <iostream>
using namespace std ;
template <class T> class Point
{ T x; T y;
public:
Point(T a=0, T b=0)
{ x = a; y = b; }
void affiche() ;
};
template <class T> void Point<T>::affiche()
{ cout << "Coordonnees : " << x << " " << y << endl;
}
int main ()
{ Point <int> ai (3, 5); ai.affiche();
Point <char> ac ('d', 'y'); ac.affiche();
Point <double> ad (3.5, 2.3); ad.affiche();
}
Généricité
79
Patron de classes
#include <iostream> int main()
using namespace std ; { Vecteur <int> v(5) ;
template <class T> class Vecteur for(int i=0; i<4 ; i++)
{ T* tab; v[i] = i ;
int taille; cout << "v : ";
public : for(int i=0; i<4; i++)
Vecteur(int); cout << v[i] << " ";
T& operator[](int i); }
};
template <class T> Vecteur<T>::Vecteur(int n)
{ tab = new T[n];
taille = n;
}
template <class T> T& Vecteur<T>::operator[](int i)
{ return tab[i];
}
Exercice
80
Exercice
81
Exercice
82
Les flots
83
Les flots
84
Les flots
85
Généralement :
Les flots
86
#include <iostream>
using namespace std ;
int main() par defaut : 12000
{ en hexadecimal : 2ee0
int n = 12000 ; en decimal : 12000
cout << "par defaut : " << n << "\n"; en octal : 27340
cout << "en hexadecimal : " << hex << n << "\n"; et ensuite : 27340
cout << "en decimal : " << dec << n << "\n"; par defaut : 1
cout << "en octal : " << oct << n << "\n"; avec noboolalpha : 1
cout << "et ensuite : " << n << "\n"; avec boolalpha : true
bool ok = true ; // ou ok = 1 et ensuite : true
cout << "par defaut : " << ok << "\n";
cout << "avec noboolalpha : " << noboolalpha << ok << "\n";
cout << "avec boolalpha : " << boolalpha << ok << "\n";
cout << "et ensuite : " << ok << "\n";
}
#include <iostream>
#include <iomanip> |****1234|
using namespace std ; |*12.35|
int main()
{
int n = 1234;
float x = 12.3456;
cout << "|" << setw(8) << setfill('*') << n << "|" << endl
<< "|" << setw(6) << setprecision(2) << x << "|" << endl;
}
Les flots
93
Les flots
94
Les flots
95
#include <iostream>
using namespace std ;
class Point
{ int x, y;
public:
Point (int abs=0, int ord=0)
{ x = abs ; y = ord ; }
friend ostream& operator<<(ostream&, Point);
friend istream& operator>>(istream&, Point&);
};
Les flots
96
Les flots
97
int main()
{
Point a(2,3), b;
cout << "point a : " << a << " point b : " << b << endl;
Le mode d'ouverture défini par une constante entière (la classe ios
comporte un certain nombre de constantes prédéfinies)
Exemple :
ofstream sortie("file.txt", ios::out);
permet de créer un flot nommé sortie et de l’associer au fichier
file.txt après avoir ouvert ce dernier en écriture.
Exemple :
sortie << .... << .... << .... ;
Exemple :
if (sortie) ....
Le mode d'ouverture défini par une constante entière (la classe ios
comporte un certain nombre de constantes prédéfinies)
Exemple :
ifstream entree("file.txt", ios::in);
permet de créer un flot nommé entree et de l’associer au
fichier file.txt après avoir ouvert ce dernier en lecture.
Exemple :
entree >> .... >> .... >> .... ;
Exemple :
if (entree) ....
La classe string
106
La classe string
107
Construction
La classe string dispose de plusieurs constructeurs :
//construction d'une chaîne vide
string ch1;
La classe string
108
Construction
La classe string dispose d'autres constructeurs permettant
d'initialiser une chaîne lors de sa construction :
//initialisation à partir d’une chaîne constante
string mess1("bonjour");
string mess1 = "bonjour";
La classe string
109
Construction
La classe string dispose aussi d’un constructeur de recopie :
string s1;
.....
string s2(s1) //ou string s2 = s1;
//construction de s2 par recopie de s1
La classe string
110