Conception de Programmes - IUT de Paris - 1ère année Les classes Introduction Déclaration d’une classe Utilisation d’une classe Définition des fonctions membres Auto-référence (instance courante) Les fonctions const Un exemple de classe
Conception de Programmes - IUT de Paris - 1ère année Introduction L’objectif est de fournir le moyen au programmeur de définir des types de données nouveaux pouvant être utilisés aussi facilement que les type prédéfinis Les programmes sont plus compréhensibles, plus concis. Les erreurs sont détectées au moment de la compilation. L’idée fondamentale est de séparer les détails de l’implantation et les propriétés essentielles pour son utilisation correcte.
Conception de Programmes - IUT de Paris - 1ère année Déclaration d’une classe Une classe est définie par 3 éléments –son nom, –la partie publique, –la partie privée. Les parties publique et privée contiennent un ensembles de déclarations –de données et –de fonctions
Conception de Programmes - IUT de Paris - 1ère année Exemple class Date { public : void set(int, int, int); void get(int&, int&, int&); void next(); void print (); private : int day, month, year; }; Partie publique Partie privée Nom de la classe 3 nouveaux mots clés : class, public et private
Conception de Programmes - IUT de Paris - 1ère année Utilisation d’une classe Les éléments (membres) de la partie publique ne peuvent être accéder que pour une variable spécifique du type adéquat Date today; today.set(22, 3, 1999); Utilisation de la notation standard d’accès à un champs d’une structure (. et -> ). Les éléments de la partie privée peuvent être utiliser uniquement par les fonctions membres.
Conception de Programmes - IUT de Paris - 1ère année Exemple void main() { Date my_birthday; Date* p = new Date; my_birthday.set(22, 3, 79); p->set(31, 12, 1999); p->next(); p->print(); cout << «c ’est la fête» << endl; p->day = 2; // erreur day est privé }
Conception de Programmes - IUT de Paris - 1ère année Définition des fonctions membres void Date::set(int d, int m, int y) { day = d; month = m; year = y; } void Date::next() { if (day < 30) day++; else { day = 1; if (month < 12) month ++; else { month = 1; year++; }
Conception de Programmes - IUT de Paris - 1ère année Une fonction membre d’une classe peut accéder aux éléments privés d’autres objets que celui pour lequel elle a été invoquée si ceux-ci font partie de la même classe void Date::copy(const Date& d) { day = d.day; month = d.month; year = d.year; }
Conception de Programmes - IUT de Paris - 1ère année void main() { Date d1, d2; d1.set(12, 10, 1987); d2.set(3, 3, 1933); } Le premier appel de la fonction set affecte –d1.day, –d1.month –et d1.year d1 est appelé l ’instance courante de l’appel à la fonction Le second appel affecte d2.day, d2.month et d2.year Auto-référence
Conception de Programmes - IUT de Paris - 1ère année Le pointeur this Un paramètre implicite est toujours passé aux fonctions membres d’une classe Il peut être explicitement désigné par this void Date::set(int d, int m, int y) { this->day = d; … } Dans chaque fonction d’une classe C, this est implicitement déclaré comme: C *const this; // pointeur constant this est initialisé comme pointant sur l’instance courante
Conception de Programmes - IUT de Paris - 1ère année Les fonctions const L’usage du mot clé const pour la déclaration d’une fonction membre indique que celle-ci ne modifie pas les données membres de la classe. class Date { public : void set(int, int, int); void get(int&, int&, int&) const; void next(); void print () const; private : int day, month, year; };
Conception de Programmes - IUT de Paris - 1ère année Une fonction membre const peut être invoquée pour un objet const ; une fonction membre ordinaire ne le peut pas. void f(Date& modifiable, const Date& fixe){ int d, m, y; modifiable.set(1, 1, 2000); // ok modifiable.get(d, m, y); // ok fixe.get(d, m, y); // ok fixe.set(1, 1, 2000); // erreur } Ceci rend essentielle la déclaration const de la fonction get
Conception de Programmes - IUT de Paris - 1ère année Le pointeur this passé à une fonction membre const d’une classe C est de type const C *const this; // pointeur constant vers une constante Ceci implique qu’une fonction membre const ne peut modifier la valeur des données de l’objet void Date::get(int& d, int& m, int& y) const { d = day; m = month; y = year; // ok day++; // erreur }
Conception de Programmes - IUT de Paris - 1ère année Un exemple de classe // fichier chaine.hpp class Chaine { public: void Initialise(const char *); void Initialise(const Chaine &); void Copie(const Chaine &); void Concatene(const Chaine &); int Compare(const Chaine &) const; int Longueur() const; const char* Acces() const; void Detruit(); private: char *s; };
Conception de Programmes - IUT de Paris - 1ère année // fichier chaine.cpp #include #include «chaine.hpp» void Chaine::Initialise(const char* ch){ s = new char[strlen(ch)+1]; strcpy(s, ch); } void Chaine::Initialise(const Chaine & st){ Initialise(st.s); } void Chaine::Copie(const Chaine & st){ Detruit(); Initialise(st.s); }
Conception de Programmes - IUT de Paris - 1ère année void String::Concatene(const String& st){ String tmp; tmp.Initialise(s); Detruit(); s = new char[tmp.Longueur()+st.Longueur()+1]; strcpy(s, tmp.s); strcat(s, st.s); tmp.Detruit(); } int String::Compare(const String& st) const { return strcmp(s, st.s); }
Conception de Programmes - IUT de Paris - 1ère année int String::Longueur() const { return strlen(s); } const char* String::Acces() const { return s; } void String::Detruit(const String& st){ delete[] s; }
Conception de Programmes - IUT de Paris - 1ère année // fichier main.cpp #include #include «chaine.hpp» void main(){ Chaine c1, c2; c1.Initialise(«le C++»); c2.Initialise(« quel beau langage!»); c1.Concatene(c2); cout << c1.Acces() << endl; c1.Detruit(); c2.Detruit(); }