C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement des objets d'une classe Utilisation d'une classe Droit d'accès aux membres d'une classe Fonctions membres notions de constructeur/destructeur fonctions membres en ligne auto-référence fonctions constantes H. Afli, M1 C++, Université du Maine, 2012-2013
NOTION DE CLASSE 1/ Classe et type généralisation de la notion de TYPE utilisateur regrouper les données et le comportement autoriser l'encapsulation des données spécifier et réaliser des TDA 2/ Classe et POO outil de conception et de programmation modéliser le réel, abstraction organiser le code (modularité) factoriser ou réutiliser le code (héritage)
CLASSE ET OBJETS une classe décrit un ensemble d'objets ayant mêmes propriétés même structure en C++ : les données membres même comportement en C++ : les fonctions membres un élément d'un tel ensemble est appelé une instance de la classe ou un représentant de la classe ou un objet de la classe ou en C++ : une variable dont le type est le nom de la classe
OBJETS INFORMATIQUES un Entier 732 un CompteEnBanque unepersonne une Chaine un Caractère numéro. titulaire. solde. --------------------- donnetonsolde dépose(unesomme) retire(unesomme) affichetoi un Réel 2025.54 nom. adresse. --------------...... 1 2 3 ------------- affichetoi une Chaine L un Caractère é un Caractère o Réseau des objets
CLASSES/INSTANCES : EXEMPLE objet abstrait (classe) Classe Compte structure numéro solde titulaire comportement donnetonsolde dépose retire affichetoi objets concrets (instances de la classe) numéro 8765 solde 5000 titulaire Jean. numéro 2345 solde -3milliards titulaire Tapie uncompte unautrecompte
CLASSES/INSTANCES tout objet est instance d'une classe la classe spécifie la structure de l'objet et son comportement le nom des variables d'état (les champs) C++ : données membres le texte des procédures définissant le comportement C++ : fonctions membres l'objet spécifie les valeurs des variables d'état (les attributs, le contenu des champs)
PROGRAMMATION OBJETS 3 moments spécification d'une classe étape de modélisation point de vue du concepteur de la classe C++ : déclaration de la classe dans un fichier. h codage des méthodes d'une classe étape de réalisation point de vue du programmeur de la classe C++ : définition des méthodes de la classe utilisation d'une classe étape de création d'instances de la classe et leur activation point de vue de l'utilisateur de la classe, du client
SPÉCIFICATION D'UNE CLASSE (DÉCLARATION) déclaration de toutes les fonctions membres (public ou private) données membres (généralement : private) interface de la classe : la partie publique de la déclaration d'une classe une classe passe un contrat avec les autres classes : elle s'engage à fournir tous les services publiés dans son interface
EN PRATIQUE par défaut : un membre est privé en général on place les déclarations de classe dans un fichier d'en-tête (.h) des membre publiques de la classe : au début de la déclaration de la classe des membres privés de la classe : à la fin (et préfixées par un soulignement) Remarque : ceci est un style de programmation il est conseillé de l'utiliser mais ce n'est pas obligatoire
PROGRAMMATION OBJETS 3 moments spécification d'une classe codage des méthodes d'une classe étape de réalisation point de vue du programmeur de la classe C++ : définition des méthodes de la classe utilisation d'une classe
CODAGE DES FONCTIONS MEMBRES D'UNE CLASSE (DÉFINITION) définir les fonctions membres généralement à l'extérieur de la définition de la classe dans un fichier.cpp préfixer le nom de la fonction membre par le nom de la classe suivi de l'opérateur de portée ::
NOM DES MEMBRES D'UNE CLASSE au sein de la définition d'une fonction membre, les données membres de l'objet receveur du message sont accessibles par leur nom (sans référence explicite à l'objet receveur du message) les fonctions membres de la classe de l'objet receveur sont accessibles sans utiliser le nom de la classe et l'opérateur de portée
PROGRAMMATION OBJETS 3 moments spécification d'une classe codage des méthodes d'une classe utilisation d'une classe étape de création d'instances de la classe et leur activation point de vue de l'utilisateur de la classe, du client
CRÉATION D'INSTANCES ET ANIMATION DU MODÈLE la fonction cliente (utilisatrice) de la classe crée des instances de la classe : en C++ en déclarant une variable de type le nom de la classe initialise l'état de ces instances (la valeur des données membres) dans ex1 : appel à la fonction membre initialiser en C++ : automatiquement par appel à un constructeur de la classe (Cf. ex 2) envoie des messages aux instances créées et initialisées pour modifier leur état obtenir des informations les faire agir
INVERSION PAR RAPPORT AU C : UN EXEMPLE en C une pile est définie comme une structure : le contenu de la pile (tableau/liste) le sommet de la pile (index ou ptr) ensuite on définit des fonctions pour manipuler cette structure (initialiser, empiler, dépiler, sommet) en C++ : la classe Pile est définie comme étant à la fois une structure (contenu, sommet) un comportement (initialiser, empiler...) Les fonctions membres appartiennent au type pile, sont invoquées en envoyant un message à un objet de type pile
CLASSE ET ACCÈS AUX MEMBRES une classe permet de réaliser un type utilisateur encapsulant les données généralement en POO les données (privées) ne sont accessibles de l'extérieur de l'objet que par les méthodes de la classe (publiques) en C++ donnée (resp. fonction) membre publique : peut être accédée (resp. invoquée) dans n'importe quelle fonction privée : peut être accédée (resp. invoquée) dans des fonctions membres (ou amies) de la classe où elle est déclarée
PLAN Classes et objets en C++ Spécification d'une classe Codage du comportement des objets d'une classe Utilisation d'une classe Inversion par rapport au C : un exemple Accès membres d'une classe Compléments sur les fonctions membres notions de constructeur/destructeur fonctions membres en ligne auto-référence fonctions constantes
CONSTRUCTEURS ET DESTRUCTEURS (PRINCIPE) type utilisateur sûr nécessite allocation et initialisation de mémoire garanties constructeurs et destructeur permettent au concepteur : d'orchestrer initialisation et allocation (en définissant un ou plusieurs constructeur(s)) libération (en définissant un destructeur) à l'utilisateur de ne pas s'en préoccuper : le compilateur génère automatiquement des appels aux constructeurs et au destructeur pour initialiser ou détruire des variables appartenant à une classe quand elles doivent l'être
CONSTRUCTEURS ET DESTRUCTEURS (EN C++) constructeurs fonctions membres publiques (en général) identificateur : nom de la classe aucun type de retour (pas même void) appelé automatiquement à chaque création d'objet destructeur fonction membre publique identificateur : nom de la classe précédé de tilde ~ ni argument ni de valeur de retour appelé automatiquement à chaque destruction d'objet
INVOCATION AUTOMATIQUE dans tous les cas où l'on définit un objet de la classe le compilateur génère automatiquement un appel au constructeur lors de la déclaration d'un objet non externe lors de la création d'un objet automatique (pile) quand un objet est créé dynamiquement (tas) (new appelle automatiquement un constructeur) le destructeur est appelé automatiquement avant la libération de la mémoire allouée à l'objet pour les objets automatiques : à la sortie du bloc ou de la fonction pour les objets dynamiques (créé par new) : lorsque l'opérateur delete est invoqué, il appelle le destructeur
RÔLES DU CONSTRUCTEUR EXPLICITE 1/ initialisation des données membres avec des valeurs passées en argument au constructeur au choix : dans le corps du constructeur par la liste d'initialisation 2/ allocation dynamique de mémoire pour des données membres (cas où les données membres sont dynamiques) 3/ construction des objets membres (cas où les données membres sont d'un type utilisateur class )
PROPRIÉTÉS DES CONSTRUCTEURS comme toutes les fonctions membres, les constructeurs peuvent être surchargés pour autoriser plusieurs façons d'initialiser un objet posséder des arguments par défaut pour éviter la prolifération des constructeurs les constructeurs sont des fonctions membres spéciales invoquées automatiquement par le compilateur pas en envoyant un message à l'objet
CONSTRUCTEURS PAR DÉFAUT constructeur par défaut : constructeur sans argument à partir du moment où une classe a défini un constructeur, il n'est plus possible de créer un objet sans fournir les arguments requis par son constructeur explicite (sauf si la classe a défini un constructeur sans argument)
DESTRUCTEUR rôle : libère la mémoire allouée pour l'objet règle : quand on définit un constructeur qui alloue de la mémoire dynamique dans le tas pour les données membres définir un destructeur pour libérer ces emplacements dans le tas plus généralement la responsabilité d'un destructeur est de détruire les ressources allouées lors de la durée de vie d'un objet (pas uniquement lors de sa construction, un objet peut adopter un pointeur)
PLAN Classes et objets en C++ Spécification d'une classe Codage du comportement des objets d'une classe Utilisation d'une classe Inversion par rapport au C : un exemple Accès membres d'une classe Compléments sur les fonctions membres notions de constructeur/destructeur fonctions membres en ligne auto-référence fonctions constantes
FONCTIONS MEMBRES EN LIGNE (DÉVELOPPABLES, "INLINE") Deux façons de définir des fonctions membres en ligne : écriture 1 : la définition de la fonction membre (pas seulement sa déclaration) est à l'intérieur de la définition de la classe écriture 2 : la définition de la fonction membre est extérieure à la déclaration de la classe mais est précédée du mot clé inline dans ce cas la définition doit figurer aussi dans le fichier d'entête
FONCTIONS MEMBRES EN LIGNE (2) écriture 1 : plus rapide (en cours, TD) confusion spécification (déclaration) et réalisation (définition) écriture 2 : plus long à écrire permet de séparer l'interface d'une classe de sa réalisation conseil : on place les fct en ligne soit à la fin du fichier d'en-tête soit dans un autre fichier d'en-tête qui est inclus à la fin du fichier de déclaration de la classe
UTILISATION DES FONCTIONS INLINE (ref : Meyers p. 128-132) Limiter les déclarations inline aux fonctions membres vraiment triviales Tenir compte des avertissements du compilateur qui refuse de développer une fonction Utiliser la règle de 80-20 : utilisez la directive inline pour les 20 % du code sur lesquels le programme passe les 80 % de son temps. Définir inline généralement les constructeurs souvent les destructeurs
AUTO-RÉFÉRENCE (THIS) le mot-clé "this" dans la définition d'une fonction membre représente un pointeur sur l'objet qui invoque la fonction membre this est un pointeur constant (pseudo-variable) on peut le consulter, pas le modifier l'objet pointé par this peut être modifié mais this ne peut l'être utilisation de this inutile (ringard) : pour accéder aux membres d'une classe indispensable : pour écrire des fonctions membres qui manipulent des pointeurs
FONCTIONS MEMBRES CONSTANTES une fonction membre constante ne modifie pas les données membres de l'objet qui l'invoque (garanti par le compilateur) dans une fonction constante this est un pointeur constant (comme d'hab) mais sur un objet constant seules les fonctions membres constantes peuvent être invoquées sur des objets constants une fonction déclarée constante doit être définie constante et réciproquement on peut surcharger une fonction membre constant par une fonction membre non constante et réciproquement distinguer : fonction constante fonction dont un argument est constant
AUTOÉVALUATION