Les classes et les objets Démo : INF3105 Structures de données et algorithmes Groupe : 40 Demonstrateur : Stéphane HENRY Courriel : Notes de Kerlyne Fostiné
Plan de la démonstration Les classes Affectation d’objet Constructeur et destructeur Les attributs et méthodes statiques d’une classe Autoréférence : this Les méthodes Surdéfinition Arguments par défaut En ligne La notion d’héritage Mise en œuvre de la notion d’héritage Le contrôle d’accès Redéfinition des méthodes Appel de constructeur Les classes abstraites
Les classes class Rationnel{ private: int num; int deno; int pgcd(); public : void simplifier(); } int Rationnel::pgcd(){ void Rationnel::simplifier(){
Les classes (Suite) Utilisation d’une classe Rationnel a a.simplifier(); a.pgcd() //incorrect methode privee a.num //incorrect donnée privée
Les classes Dans un projet C++ On déclare les classes dans un fichier d’entête hpp Déclaration des attributs Déclaration des prototypes des méthodes On définit les classes dans un fichier cpp Définition de chacune des méthodes (Privés, public, protégé) On utilise la classe dans un autre fichier cpp Un exemple un fichier contenant la fonction main qui crée un objet de la classe ou une fonction ou une autre méthode.
Affectation d’objets Copie des données membre privées et publiques dans l’autre objet Rationnel a, b; a = b //Affectation Cette affectation est simple, c’est correct. Affectation superficiel si dans la classe, les données membres sont de type pointeur. Il faudrait surdéfinir l’opérateur = pour les objets en question.
Constructeurs et destructeur Constructeur : Méthode appelée automatiquement lors de la création des objets de la classe Utilisé le plus souvent pour initialiser les ressources utilisées par la classe Même nom que la classe Pas de valeur de retour Rationnel(int num, int num) Destructeur : Méthode appelée automatiquement lors de la destruction des objets de la classe. Utilisé le plus souvent pour libérer les ressources utilisées par l’objet. Même nom que la classe avec ~ au début Pas d’arguments ~Rationnel()
Les attributs et les méthodes statiques d’une classe Attributs et méthodes liés à la classe et non aux objets de la classe Initialisation d’attribut ne peut être réalisée à l’intérieur d’un constructeur Méthode n’opérant pas sur les attributs non static de la classe Méthode publique pouvant être appelé à partir du nom de la classe à l’aide de l’opérateur de portée ::
Les méthodes Surdéfinition Arguments par défauts En ligne Définition d’une méthode plusieurs fois avec le nombre d’arguments différent ou le type d’arguments différent afficher() afficher(string message) Arguments par défauts Déclaration du prototype Fonction(int, int = 5) Définition de la fontion Void fonction(int a, int b){ a } En ligne Fonction définie à l’intérieur de la classe
Exercice I Écrire en C++ une classe représentant les nombres Rationnel. A l’intérieur de cette classe il doit y avoir les méthodes suivantes : Un constructeur avec le numérateur et le dénominateur passé en paramètre Un constructeur avec seulement le numérateur passé en paramètre (Par défaut le dénominateur est égal à 1) Un constructeur sans argument pour créer un rationnel dont le numérateur est égal à 0 et le dénominateur égal à 1; simplifier : permettant de simplifier l’objet rationnel. (Exemple 5/10 est simplifier à ½). Cette méthode doit faire appel à une autre méthode privée de la classe (pgcd) pour réaliser la simplification additionner : permettant d’additionner l’objet rationnel en cours à un autre objet rationnel qu’on a passé en paramètre. Le prototype de la méthode est : Rationnel additionner (Rationnel );
Exercice I (Suite) additionner : permettant d’additionner 2 objets rationnels. Cette méthode doit être statique. Le prototype de la méthode est : Rationnel additionner (Rationnel, Rationnel) soustraire : permettant de soustraire un rationnel passé en paramètre de l’objet rationnel en cours. Le prototype de la méthode est : Rationnel soustraire (Rationnel ); soustraire : permettant de soustraire b de a. Cette méthode doit être statique. Le prototype de la méthode est : Rationnel soustraire (Rationnel a, Rationnel b) multiplier : permettant de multiplier 2 objets rationnels passés comme paramètre. Cette méthode doit être statique. Le prototype de la méthode est : Rationnel multiplier(Rationnel, Rationnel)
Exercice I (Suite) multiplier : permettant de multiplier l’objet rationnel en cours à un autre objet rationnel qu’on a passé en paramètre. Le prototype de la méthode est : Rationnel multiplier(Rationnel ); Afficher : permettant d’afficher le rationnel. Ensuite il faut créer un programme contenant la fonction main qui comporte les menus suivants : 1 : Addition de 2 rationnels. 2 : Soustraction de 2 rationnels. 3 : Multiplication de 2 rationnels. 4 : Sortir du programme
La notion d’héritage L’héritage : Mécanisme par lequel une classe dite dérivée hérite des « potentialités » (attributs et méthodes) d’une autre classe dite de base, toute en lui ajoutant de nouvelles. Héritage simple : La classe dérivée hérite d’une seule classe. Héritage multiple : La classe dérivée hérite de plusieurs classes. Une classe dérivée peut devenir a son tour classe de base pour une autre classe. Plusieurs classes pourront être dérivée d’une meme classe de base. 13
Mise en œuvre de la notion d’héritage Définition d’une classe dérivée class A{ //Définition de la classe A //Définition des attributs et des méthodes de A } class B : public A{ //Classe B hérite de A //Définition des attributs et des méthodes de B 14
Mise en œuvre de la notion d’héritage class A{ //Définition de la classe A int x; int y; public : void initialiser(); void afficher(); } class B : public A{ //Classe B hérite de A int c; void iterer(); B objet1; objet1.initialiser(); objet1.iterer(); 15
Le contrôle d’accès La déclaration class B : public A spécifie que B hérite de A Le mot clé public spécifie une dérivation publique c’est-a-dire les membres publics de la classe de base (A) seront des membres publics de la classe dérivée (B) La classe dérivée n’a pas accès aux membres prives de la classe de base et ses utilisateurs non plus. La classe dérivée a accès aux membres protégés (protected) de la classe de base mais ses utilisateurs n’ont pas accès a ces membres. Avec une dérivation privée, les membres publics de la classe de base sont devenus privés pour les utilisateurs de la classe dérivée mais restent publics pour les classes dérivées Avec une dérivation protégée, les membres publics de la classe de base sont devenus protégés pour une dérivation ultérieure. 16
Exercice II Voir le fichier des exercices. 17
Redéfinition des méthodes de la classe de base dans une classe dérivée Dans une fonction dérivée, on peut avoir une méthode ayant le même prototype qu’une méthode de la classe de base, dans ce cas la classe dérivée redéfinie la méthode de la classe de base. Dans la méthode redéfinie de la classe dérivée pour faire appel a la même méthode de la classe de base, il faut faire usage de l’opérateur de résolution de portée (::). Classe_de_base::methode(); Si un objet de la classe dérivée fait appel a une méthode redefinie, il fera appel directement a la méthode de la classe dérivée. S’il veut faire appel a la même méthode de la classe de base, il doit le faire de la façon suivante : Objet.classe_de_base::methode(); 18
Appel de constructeur Lors de la création d’un objet d’une classe dérivée, il y a d’abord appel du constructeur de la classe de base puis le constructeur de la classe dérivée Si le constructeur de la classe de la classe de base nécessite des arguments, dans la définition du (des) constructeur(s) de la classe dérivée il faut prendre en compte ces mêmes arguments en plus d’autres arguments utiles a la classe dérivée et transmettre les arguments requis a la classe de base. class A{ A(int a, int b) } class B : public A{ B(int a, int b, int c) : A(a, b) 19
Exercice III Voir le fichier des exercices 20