Chap-2 : Les Classes en C++ المدرسة الوطنية للمهندسين بتونس École Nationale d’I
Chap-2 : Les Classes en C++ المدرسة الوطنية للمهندسين بتونس École Nationale d’Ingénieurs de Tunis Kamel Hamrouni Abir Gallas Introduction Objectif : Concevoir des programmes sous la forme d’objets qui s’échangent des messages au lieu d’avoir une liste de sous-programmes qui se partagent des données. Chaque objet aura ses propres données et ses propres programmes spécialisés dans la manipulation de ses données. Les données seront inaccessibles au monde extérieur qui ne connaît l’objet que par l’intermédiaire d’un certain nombre de points d’accès. C’est le concept d’encapsulation des données : 2 Interface d’utilisation Données Fonctions internes Un objet sera caractérisé par plusieurs notions : Les attributs : qui sont les données de l’objet. Les méthodes : appelées aussi fonctions membres : Elles caractérisent le comportement de l’objet c’est à dire l’ensemble des actions que l’objet peut réaliser. L’identité : chaque objet doit avoir une identité qui permet de le distinguer des autres objets. La structure d’un objet fera l’objet d’une déclaration au sein de ce qui est appelé « classe ». Plusieurs objets peuvent avoir la même structure donc issus d’une même classe. Par exemple, la structure d’une voiture (moteur, roues, cabine,…) fera l’objet d’une classe alors qu’une mercedes-200 est un objet de type voiture. Les avantages d’une telle conception sont : Protection des données, Meilleure structuration du programme, Maintenance plus facile. 3 Introduction (2) Définition d’une classe La classe décrit le modèle structurel d’un objet. Elle est composée de : Ensemble des attributs (ou champs ou données membres) décrivant sa structure Ensemble des opérations (ou méthodes ou fonctions membres) qui lui sont applicables. Une classe en C++ est une structure qui contient : Des fonctions membres Des données membres Les mots réservés public et private délimitent les sections visibles par l’application. 4 Exemple class Avion { private : // membres privées char immatriculation[6], *type; // données membres privées float poids; void erreur(char *message); // fonction membre privée public : // fonctions membres publiques void init(char [ ], char *, float); void affiche(); }; // n’oubliez pas ce ; après l’accolade 5 Définition d’une classe (2) Droits d’accès 6 L’encapsulation consiste à masquer l’accès à certains attributs et méthodes d’une classe. Elle est réalisée à l’aide des mots clés : private: les membres privés ne sont accessibles que par les fonctions membres de la classe. La partie privée est aussi appelée réalisation. protected: les membres protégés sont comme les membres privés. Mais ils sont aussi accessibles par les fonctions membres des classes dérivées (voir l’héritage). public: les membres publics sont accessibles par tous. La partie publique est appelée interface. Les mots réservés private, protected et public peuvent figurer plusieurs fois dans la déclaration de la classe. Le droit d’accès ne change pas tant qu’un nouveau droit n’est pas spécifié. Types de Classes Les deux structures « struct » et « union » introduites par le langage C et la structure « class » introduite par le C++ sont considérées comme des classes. Mais c’est la troisième qui est la plus utilisée. struct Classe1 { /* ... */ }; T ous les membres sont par défaut d’accès public, le contrôle d’accès est modifiable. Cette structure est conservée pour pouvoir compiler des programmes écrits en C Exemple struct Date { // méthodes publiques (par défaut) void set_date(int, int, int); void next_date(); // autres méthodes .... private : // données privées int jour, mois, an; }; 7 8 Types de Classes (2) union Classe2 { /* ... */ }; Tous les membres sont d’accès public par défaut le contrôle d’accès n’est pas modifiable class Classe3 { /* ... */ }; Tous les membres sont d’accès private (par défaut). Le contrôle d’accès est modifiable. C’est cette dernière forme qui est utilisée en programmation objet C++ pour définir des classes. Recommandation de style Pour écrire des programmes claires et faciles à relire et à comprendre, il vaut mieux adopter quelques conventions de style. On pourrait par exemple choisir de mettre : La première lettre du nom de la classe en majuscule La liste des membres publics en premier Les noms des méthodes en minuscules 9 Définition des fonctions membres En général, la déclaration d’une classe contient simplement les prototypes des fonctions membres de la classe. Les fonctions membres sont définies dans un module séparé ou plus loin dans le code source. Déclaration à l’extérieur de la classe class Avion { private : char immatriculation[6], *type; float poids; void erreur(char *message); public : void init(char [ ], char *, float); // prototype des fonctions membres void affiche(); }; 10 11 void Avion::init(char m[ ], char *t, float p) { strcpy(immatriculation, m); type = new char [strlen(t)+1]; strcpy(type, t); poids = p; } void Avion::affiche() { cout << immatriculation << " " << type; cout << " " << poids << endl; } Syntaxe générale : type_valeur_retournée Classe::nom_fonction ( paramètres_formels ) { // corps de la fonction } Définition des fonctions membres (2) Définition des fonctions membres (3) Déclaration à l’intérieur de la classe La définition de la méthode peut avoir lieu à l’intérieur de la déclaration de la classe. Dans ce cas, ces fonctions sont automatiquement traitées par le compilateur comme des fonctions inline. Une fonction membre définie à l’extérieur de la classe peut être aussi qualifiée explicitement de fonction inline. Exemple class Nombre { private : int nbre; public : void setnbre(int n) { nbre = n; } // fonction inline int getnbre() { return nbre; } // fonction inline void affiche(); }; void Nombre::affiche() { /* fonction inline : La visibilité d’une fonction inline est restreinte au module dans lequel elle est définie. */ cout << "Nombre = " << nbre << endl; } 12 Instanciation d’une classe 13 De façon similaire à une struct ou à une union, le nom de la classe représente un nouveau type de donnée. On peut donc définir des variables de ce nouveau type; on dit alors que vous créez des objets ou des instances de cette classe. Exemple Avion av1; // une instance simple (statique) Avion *av2; // un pointeur (non initialisé) Avion compagnie[10]; // un tableau d’instances av2 = new Avion; // création (dynamique) d’une instance Utilisation des objets Après avoir créé une instance (de façon statique ou dynamique) on peut accéder aux attributs et méthodes de la classe. Cet accès se fait comme pour les structures à l’aide de l’opérateur . (point) ou -> (tiret supérieur). Exemple av1.init("FGBCD", "TB20", 1.47); av2->init("FGDEF", "ATR 42", 80.0); compagnie[0].init("FEFGH","A320", 150.0); av1.affiche(); av2->affiche(); compagnie[0].affiche(); av1.poids = 0; // erreur, poids est un membre privé 14 Exemples Nombre complexe Un objet complexe doit contenir deux composantes réelles et doit répondre aux fonctions suivantes : initialiser un nombre complexe ajouter deux nombres complexes soustraire deux nombres complexes multiplier deux nombres complexes afficher un nombre complexe etc. Attributs : Deux réels : x et y Méthodes : Initialiser, Ajouter, Soustraire, Multiplier, afficher 15 class complexe { public: float x,y ; void init (float a=0, float b = 0); void ajouter (complexe z); void soustraire (complexe z); void multiplier (complexe z); void afficher ( ); }; void complexe::init(float a , float b) { x = a; y = b ; } 16 Exemples (2) Exemples (3) 17 void complexe::ajouter(complexe z) { x = x + z.x ; y = y + z.y ; } void complexe ::soustraire(complexe z) { x = x - z.x ; y = y - z.y ; } void complexe ::multiplier(complexe z) { x = x*z.x - y*z.y ; y = x*z.y + y*z.x ; } void complexe::afficher( ) { if y>=0 cout <<x<< « +i »<<y ; else cout <<x<< « -i »<<-y ; } Exemples 18 Pile d’entiers Un objet Pile doit répondre aux fonctions suivantes : Initialiser une pile Empiler un élément sur la pile Dépiler un élément de la pile Pour cet exemple, nous allons supposer que les éléments à empiler sont de type entier et nous allons utiliser un tableau linéaire pour l’implémentation. Exemples (2) 19 #include <iostream.h> class pile { int tab [100]; // Tableau pour contenir les éléments int k; // indice dans tab de la première position libre int max; // nombre maximum de places dans la pile public: void init (); int push (int x); int pop (int &x); int full (); int empty (); }; Exemples (3) 20 //----------------- init ----------------------------- void pile::init () { k=0 ; max = 100; } //----------------- full ----------------------------- int pile::full() { return (k >= max ) ; } //----------------- empty --------------------------- int pile::empty() { return (k == 0 ) ; } Exemples (4) 21 //----------------- push ----------------------------- int pile::push (int x) { if (!full()) { tab[k++] = x; return 1; } else return 0;} //----------------- pop ----------------------------- int pile::pop (int &x) { if ( !empty () ) { x= tab[--k]; return 1; }else return 0;} /*Le programme main comprend la définition d’une classe Pile et uploads/Ingenierie_Lourd/ chap-2-les-classes-en-c-partie3.pdf
Documents similaires










-
27
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Jul 02, 2022
- Catégorie Heavy Engineering/...
- Langue French
- Taille du fichier 0.6042MB