Académique Documents
Professionnel Documents
Culture Documents
NB : Lorsqu'il n'y a pas de modificateur d'accès pour un membre, il est privé par défaut.
Pour contourner cette limitation, C++ définit trois modificateurs d'accès. Le concepteur d'une
classe peut appliquer un modificateur d'accès à la déclaration d'un membre pour contrôler
l'accès à ce membre.
Modificateurs d'accès
C++ utilise trois modificateurs à cette fin : private, public et protected, comme illustré à la figure ci-
dessous.
Lorsqu'un membre est privé, il n'est accessible qu'à l'intérieur de la classe (via les fonctions membres).
Lorsqu'un membre est public, il est accessible de n'importe où (à l'intérieur de la même classe, à
l'intérieur des sous-classes et dans l'application). Nous discuterons des membres protected lorsque
nous aborderons la notion d’héritage (les sous-classes).
Modificateurs d'accès pour les données membres
Les modificateurs des données membres sont normalement définis sur private pour la mise en
évidence (bien qu'aucun modificateur ne signifie privé). Cela signifie que les données membres ne
sont pas accessibles directement. Ils doivent être accessibles via les fonctions membres. Cependant,
une donnée membre privé est visible, mais il n'est pas accessible, sauf via une fonction membre.
NB : Les données membres d'une classe sont normalement définies sur private.
La déclaration d'une fonction membre donne son prototype ; chaque fonction membre a
également besoin d'une définition. Généralement la définition d'une fonction est faite séparément,
c’est-à-dire en dehors de la déclaration de la classe.
La définition de chaque fonction membre est similaire à la définition d’une fonction, mais elle
diffère de celle-ci avec deux aspects. Le premier aspect est que le qualificatif (const) peut être
appliqué à la définition de la fonction membre. Le second aspect est le nom de la fonction
qui doit être qualifié avec le nom de la classe.
NB: Il faut aussi notez que dans la définition de la fonction membre, le type de retour de la
fonction doit précéder le nom entier de la fonction membre.
Définition des fonctions membres
Ci-dessous nous présentons une définition pour chaque fonction membre de la classe Circle
précédemment définie.
double Circle :: getRadius () const
{ return radius;
}
double Circle :: getArea () const
{ const double PI = 3.14;
return (PI * radius * radius);
}
double Circle :: getPerimeter () const
{ const double PI = 3.14;
return (2 * PI * radius);
}
void Circle :: setRadius (double value)
{ radius = value;
}
Les Fonctions inline
Lorsque le corps d'une fonction est court, le temps d'exécution impliqué dans l'appel de la fonction
(stockage des arguments, transfert du contrôle, récupération de l'argument et stockage de la valeur de
retour) peut être supérieur à l'exécution du code à l'intérieur de la fonction. Pour améliorer les
performances du programme, nous pouvons déclarer une fonction en tant que fonction inline
pour indiquer que le compilateur peut remplacer l'appel de fonction par le code réel de la
fonction.
Instanciation d’Objet
Une instance est un objet qui encapsule les données membres définis dans la déclaration de
classe. Avant d'utiliser une fonction membre, nous devons instancier un objet de la classe
comme indiqué ci-dessous :
Circle circle1;
Après cette ligne, nous avons un objet nommé cercle1 qui encapsule une seule donnée membre
(ou variable) nommé rayon de type double, qui contient les ordures laissées par l'opération
précédente. Il faut changer la valeur de cette variable avant de l'utiliser.
Application d'une opération sur des objets
Après instanciation, nous pouvons laisser l'objet appliquer sur lui-même une ou plusieurs
opérations définies dans la définition de la fonction membre.
circle1.setRadius (10.0);
cout << "Radius: " << circle1.getRadius() << endl;
cout << "Area: " << circle1.getArea() << endl;
cout << "Perimeter: " << circle1.getPerimeter() << endl << endl;
La première ligne définit le rayon du cercle1. La deuxième ligne obtient la valeur du rayon du
cercle. Les deux lignes suivantes calculent et impriment l'aire et le périmètre de l'objet nommé
cercle1.
Sélection des membres
Le point utilisé entre le nom de l'objet et la fonction membre censée opérer sur l'objet est
appelé l'opérateur de sélection de membre. En d'autres termes, nous pouvons appliquer la
même fonction sur différents objets en utilisant cet opérateur comme indiqué ci-dessous :
D'autre part, lorsque nous n'avons plus besoin d'un objet, l'objet doit être nettoyé (ou detruit)
et la mémoire occupée par l'objet doit être recyclée. Le nettoyage de l’objet est
automatiquement effectué lorsqu'une autre fonction membre spéciale nommée destructeur est
appelée, l'objet sort de la portée et le corps du destructeur est exécuté ; le recyclage de la
mémoire est effectué à la fin du programme.
Constructeurs et Destructeurs
NB : Un constructeur est une fonction membre spéciale qui crée et initialise un objet. Un
destructeur est une fonction membre spéciale qui détruit un objet et libère l’espace mémoire qu’il
occupe (recyclage).
En d'autres termes, comme le montre la figure suivante, un objet passe par cinq étapes. Il est créé et
initialisé par une fonction membre spéciale appelée constructeur. Il applique certaines opérations
demandées par l'application sur elle-même. Il est nettoyé et recyclé par une autre fonction membre
spéciale appelée destructeur.
On distingue trois types de constructeurs dans une classe : les constructeurs de paramètres,
les constructeurs par défaut et les constructeurs de copie.
Constructeur de Paramètres
Normalement, nous avons un constructeur de paramètres qui initialise les données membres
de chaque instance (objet) avec des valeurs spécifiées. Le constructeur de paramètres peut
être surchargé, ce qui signifie qu’on peut avoir plusieurs constructeurs de paramètres
chacun avec une signature différente. L'avantage du constructeur de paramètres est que
nous pouvons initialiser les données membres de chaque objet avec une valeur
spécifique. En d'autres termes, si nous utilisons un constructeur de paramètres, le rayon d'un
cercle peut être initialisé à 3,1, un autre à 4,6, et ainsi de suite.
Le constructeur par défaut est un constructeur sans paramètres. Il est utilisé pour créer
des objets avec chaque données membre pour tous les objets définis sur des valeurs littérales
ou des valeurs par défaut. Il faut noter que nous ne pouvons pas surcharger le constructeur par
défaut car il n'a pas de liste de paramètres et n'est donc pas éligible à la surcharge.
NB : Le constructeur par défaut ne peut pas être surchargé pour une classe.
Constructeur de copier
Parfois, nous voulons initialiser chaque donnée membre d'un objet à la même valeur qu'une
donnée membre correspondant d'un objet créé précédemment. On peut utiliser un constructeur
de copie dans ce cas. Un constructeur de copie permet de copier les valeurs des données
membres de l'objet donné dans le nouvel objet qui vient d'être créé. Après avoir appelé le
constructeur de copie, les objets source et destination ont exactement la même valeur
pour chaque membre de données, bien qu'il s'agisse d'objets différents. Le constructeur
de copie n'a qu'un seul paramètre qui reçoit l'objet source par référence. Le modificateur
const devant le type de paramètre garantit que le passage par référence ne peut pas modifier
l'objet source.
Constructeur de Copier
Rappelons que le passage par référence a deux caractéristiques. Tout d'abord, il n'est pas
nécessaire de copier physiquement l'objet. Deuxièmement, un changement dans la destination
signifie le même changement dans la source. En utilisant le modificateur const, on garde la
première caractéristique, mais on interdit la seconde.
A noter également qu’on ne peut pas surcharger le constructeur de copie car la liste des
paramètres est fixe et nous ne pouvons pas avoir de forme alternative.
NB : Tous les constructeurs de la classe sont normalement publics, donc l'application peut appeler
n'importe lequel des constructeurs pour initialiser un objet de la classe.
Définition du Constructeur
Un constructeur est une fonction membre, mais spéciale. Il ne peut pas avoir de valeur de retour et
son nom est le même que le nom de la classe. Ce qui suit montre la définition des trois
constructeurs pour la classe Circle.
Définition du constructeur de paramètre Définition du constructeur par défaut
: radius (rds) // la liste d’initialisation : radius (1.0) // la liste d’initialisation. S'il est manquant, le rayon est défin
{ // sur des valeurs parasites
// tout autres instructions
{
}
// tout autres instructions
}
Définition du Constructeur
Définition du constructeur de copie
NB : Un destructeur est une fonction membre spéciale sans paramètre et est conçu pour
nettoyer et recycler un objet.
Déclaration du destructeur
Ce qui suit montre la déclaration du destructeur dans la définition de classe.
class Circle
{
...
public:
...
~Circle (); // le destructeur
}
Définition du destructeur
La définition d'un destructeur est similaire à la définition des trois autres fonctions membres,
mais il doit avoir un tilde (~) devant le prénom. Un destructeur doit être public comme
tous les constructeurs.
Circle :: ~Circle ()
}
Création et Destruction des Objets
L'appel d'un constructeur crée un objet. Lorsque le constructeur est exécuté, il initialise les
données membres. De même, lorsqu'un destructeur est exécuté, les données membres sont
nettoyées. Lorsque le programme est terminé, les emplacements de mémoire sont libérés.
La figure suivante montre la syntaxe pour appeler un constructeur de paramètre, un
constructeur par défaut et un constructeur de copie. Il n'y a pas de syntaxe pour appeler un
destructeur car il est appelé par le système.
Constructeur de Paramètre : Circle circle1 (5.1);
Constructeur par Défaut : Circle circle2; // pas de parenthèse
Constructeur de Copie: Circle circle3 (aCircle); // aCircle est un objet qui existe
Destructeur : il est appelé par le système.