Académique Documents
Professionnel Documents
Culture Documents
Une classe est un type défini par l’utilisateur. Une classe se déclare à l’aide du mot clé class
et regroupe des données membres et des fonctions membres (ou méthodes) agissant sur ces
données membres.
class Nom-de-la-classe
{
private :
Données et fonctions membres privées
Protected :
Données et fonctions membres protégées
public :
Données et fonction publiques
};
Définitions :
objet : Un objet est une instance d’une classe, c’est à dire un emplacement mémoire
adressable dont le type est celui de la classe
fonction membre (ou méthode) : un membre d'une classe qui est une fonction ; les
classe, avec la possibilité de rendre privés certains d'entre eux. Encapsuler n'est pas
Les variables sont le plus souvent private ou protected, tandis que les méthodes sont
usuellement public.
Par défaut, tous les membres d’une classe ont l’accessibilité private
class A
{
private :
-------
protected : Interdit
-------
public :
-------
};
A objA
Figure 1. : L’effet des accessibilités sur les fonctions membres et les objets d’une classe
Les fonctions membres d’une classe peuvent accéder aux membres publics protégés et
privés.
Les objets d’une classe ne peuvent accéder qu’aux membres publics de la classe.
Graphiquement, selon la notation UML une classe peut se présenter comme il suit :
Fonctions membres
Exemple :
Allocation dynamique
L’opérateur "."
L’opérateur "." permet un accès direct aux attributs ou méthodes de l’instance :
Ex :
#include <iostream>
using namespace std;
class Boite
{
public:
double longueur;
double largeur;
double hauteur;
double volume()//fonction par défaut inline
{return longueur*largeur*hauteur ;}
} ;
int main()
{
Boite b1 ;// b1 est un objet ou instance de la classe Boite
b1.longueur= 78.0;
b1.largeur= 24.0;
b1.hauteur=18.0 ;
double volb1 =0.0 ;
volb1 = b1.volume() ;
cout << endl
<< "Volume de la boite b1 :" << volb1 << endl ;
return 0 ;
}
Les fonctions définies à l'intérieur d'une classe sont implicitement qualifiées « en ligne »
(inline). Conséquence : la plupart des fonctions membres seront définies séparément. Seules
les fonctions courtes, rapides et fréquemment appelées mériteront d'être définies dans la
Ex :
#include <iostream>
using namespace std;
class Boite
{
public:
double longueur;
double largeur;
double hauteur;
double volume() ;
} ;
int main()
{
Boite b1 ;
b1.longueur= 78.0;
b1.largeur= 24.0;
b1.hauteur=18.0 ;
double volb1 =0.0 ;
volb1 = b1.volume() ;
cout << endl
<< "Volume de la boite b1 :" << volb1 << endl ;
return 0 ;
}
2. Constructeurs et destructeurs
2.1. Constructeurs
Ex :
#include <iostream>
using namespace std;
class Boite
{
public:
double longueur;
double largeur;
double hauteur;
Boite(double lg, double lr, double ht)
{
longueur = lg ;
largeur = lr ;
hauteur = ht ;
}
double volume()
{ return longueur*largeur*hauteur ;}
} ;
int main()
{
Boite b1(78.0,24.0,18.0);//Boite b1=Boite(78.0,24.0,18.0);
Boite b2(8.0, 5.0, 1.0) ;
double volb =0.0 ;
volb = b1.volume() ;
cout << endl ;
cout<< "Volume de la boite b1 :" << volb << endl ;
return 0 ;
}
Le constructeur par défaut est un constructeur qui peut être appelé sans paramètres : ou bien
il n'en a pas, ou bien tous ses paramètres ont des valeurs par défaut.
largeur = lr ;
hauteur = ht ;
Ex :
{
…
}
2.2. Destructeurs
Un destructeur est une fonction membre spéciale. Il a le même nom que la classe, précédé du
par classe. Le destructeur d'une classe est appelé lorsqu'un objet de la classe est détruit.
Les objets qui sont les valeurs de variables globales sont détruits immédiatement après la
terminaison de la fonction principale (en principe main), dans l'ordre inverse de la déclaration
Les objets qui ont été alloués dynamiquement ne sont détruits que lors d'un appel de delete
les concernant.
Ex :
~Boite()
{
Instructions du destructeur
}
Une fonction amie d'une classe est une fonction qui, sans être membre de cette classe, a le
droit d'accéder à tous ses membres, aussi bien publics que privés.
Une fonction amie doit être déclarée ou définie dans la classe qui accorde le droit d'accès,
Ex :
// fonctions amies
#include <iostream>
using namespace std;
class Beta; // nécessaire ici pour la déclaration de la
//function amie
class Alpha
{
private:
int data;
public:
Alpha(): data(3)
{ }
friend int frdfunc(Alpha, Beta); // function amie
};
class Beta
{
private:
int data
public:
Beta(): data(7)
{ }
friend int frdfunc(Alpha, Beta);
};
int main()
{
Alpha aa;
Beta bb;
cout <<frdfunc(aa,bb) << endl;
return 0;
}
Toutes les fonctions membres d’une classe peuvent devenir fonctions amies si la classe elle-
même est amie. Une classe amie d'une classe C est une classe qui a le droit d'accéder à tous
les membres de C. Une telle classe doit être déclarée dans la classe C (la classe qui accorde
le droit d'accès), précédée du mot réservé friend, indifféremment parmi les membres privés ou
Ex :
//classes amies
#include <iostream>
using namespace std;
class Alpha
{
private:
int data;
public:
Alpha(): data(3)
{ }
// void afficherBeta(Beta b)
//{cout<<b.data;}
friend class Beta; // Beta comme classe amie de Alpha
};
class Beta
{
public:
void func1(Alpha a)
{cout << "\ndata=" << a.data;}
void func2(Alpha a)
{cout << "n\data=" << a.data;}
};
int main()
{
Alpha unAlpha;
Beta unBeta;
//unAlpha.afficherBata(unBeta) ;
unBeta.func1(unAlpha);
unBeta.func2(unAlpha);
cout << endl;
return 0;
}
Exemple introductif
class Stack
{
private :
int st[MAX] ;// tableau d’entiers
int top ;//l’indice du sommet du tas
public :
Stack() ;//constructeur
void push(int var) ;
int pop() ;
} ;
Si nous voulions stocker des types long nous serions obligés de définir une nouvelle classe :
class LongStack
{
private :
long st[MAX] ;
int top ;
public :
LongStack() ;
void push(long var) ;
long pop() ;
} ;
#include <iostream>
using namespace std ;
const int MAX = 100;
template <class Type>
class Stack
{
private:
Type st[MAX];
int top;
public:
Stack()
{top = -1;}
Type pop()
{return st[top--];}
};
int main()
{
Stack<float> s1; // s1 est un objet de la classe Stack<float>
s1.push(1111.1F) ;
s1.push(2222.2F) ;
s1.push(3333.3f) ;
cout << "1 : "<< s1.pop() <<endl;
cout << "2 : "<< s1.pop() <<endl;
cout << "3 : "<< s1.pop() <<endl;
return 0;
}
#include <iostream>
using namespace std ;
const int MAX = 100;
template <class Type>
class Stack
{
private:
Type st[MAX];
int top;
public:
Stack();
void push(Type var);
Type pop();
};
template<class Type>
Stack<Type>::Stack()
{top = -1;}
template<class Type>
void Stack<Type>::push(Type var)
{st[++top]= var;}
template<class Type>
Type Stack<Type>:: pop()
int main()
{
Stack<float> s1; // s1 est un objet de la classe Stack<float>
s1.push(1111.1F) ;
s1.push(2222.2F) ;
S1.push(3333.3f) ;
cout << "1 : "<< s1.pop() <<endl;
cout << "2 : " << s1.pop() <<endl;
cout << "3 : " << s1.pop() <<endl;
return 0;
}
Les pointeurs peuvent pointer sur des objets de la même manière qu’ils pointent
sur les variables.
Dans les situations ou on ne sait pas d’avance combien d’objets seront créés on
peut utiliser le mot clé new pour créer des objets pendant l’exécution du
programme. L’utilisation de new permet de retourner un pointeur sur un objet sans
nom.
Ex :
#include <iostream>
using namespace std;
class Distance
{
private:
int m;
double cm;
public:
void getDistance()
{
cout<<"\n Entrer les metres: ";
cin>>m ;
cout<< " Entrer les centimetres : " ;
cin>>cm ;
}
} ;
int main()
{
Distance dist ;
dist.getDistance() ;
dist.afficherDistance() ;
#include <iostream>
using namespace std ;
class Element
{
public:
int donnee;
Element* suivant;
};
class ListeChainee
{
private:
Element* premier;
public:
ListeChainee()
{premier = NULL;}
void ajouterElement(int d);
void afficherLesElements() ;
} ;
int main()
{
ListeChainee lc ;
lc.ajouterElement(25) ;
lc.ajouterElement(36) ;
lc.ajouterElement(49) ;
lc.ajouterElement(64) ;
lc.afficherLesElements() ;
return 0 ;
}
EXERCICE DE PROGRAMMATION
I) Construire une classe appelée Tableau. Les données membres seront
constituées par les éléments de type entier d’un tableau à une dimension.
a. Définir les méthodes comme ci-après :
- afficherDonne() pour afficher les données du tableau
- altererDonne() pour altérer les éléments du tableau
- triTableau() pour faire le tri du tableau
- sommeElement() pour retourner la somme des éléments du tableau
- plusPetitElement() pour retourner le plus petit élément du tableau
- plusGrandElement() pour retourner le plus grand élément du tableau
b. Tester la classe ainsi construite dans la méthode principale main()
II) Considérer l’exercice précédent avec une classe générique (template) capable de
prendre un tableau de type quelconque.