Next Contents




Classes-I : sommaire


Classes-I  1




Classes-I : définitions












 

Comment définir un tel objet ???


Classes-I  2




Classe


class compte {
   int solde ;
   char nom_proprio[50];
   void maj_solde(int);
   ...
   void deposer(int);
   void retirer(int);
   ...
};


Classes-I  3


Attribut

Méthode


Classes-I  4




Objet

Déclarations et définitions

compte    c1;
compte    c2 = compte() ; // idem que c1
compte    *pt1, *pt2=&c2 ; // pointeurs
compte&    ref = c1 ; // référence
compte    tab[10];// tableau d'instances
compte    c3() ;// !! CECI DECLARE 1 FONCTION!!



Allocation dynamique
pt1 = new compte ;
pt2 = new compte[7] ;
delete pt1 ;
delete [] pt2 ;


Classes-I  5


Contrôle d'accès aux membres d'une classe (1)







Exemple (compte.hh) :
class compte {
private :
   int solde ;
   char nom_proprio[50] ;
   void maj_solde(int);
public :
   void retirer(int) ;
   void deposer(int) ;
   int getSolde(void) ;
   ...
};


Classes-I  6


Contrôle d'accès aux membres d'une classe (2)


Classes-I  7




Contrôle d'accès aux membres d'une classe (3)

Règle pratique : définir les données en private (ou protected), et définir en public des méthodes pour les services de la classe.

Accès illicites
int main() {
   compte c1;
   c1.solde = 1000 ; // Erreur : champ privé
   cout << c1.nom_proprio ; // idem
   c1.maj_solde(-100); // idem
}

Accès licites

int main() { ...
   if (c1.getSolde() >= retrait)
      c1.retirer(retrait) ;
   i = pt->getSolde() ;
} // getSolde() et retirer() sont publiques


Classes-I  8




Fonctions membres : déclaration

Exemple (compte.hh) :
class compte {
private:
   int solde ;
   char nom_proprio[50] ;
   void maj_solde(int);
public:
   int retirer(int somme);// définie ailleurs
   int getSolde(void) { // décl. avec définition
      return solde ;
   }
...
} ;

Classes-I  9




Fonctions membres : définition

Exemple (compte.cc) :
#include "compte.hh"
int compte::retirer(int somme) {
   maj_solde(-somme) ;
}

Remarque : dans le corps d'une méthode, on peut accéder aux attributs privés de toutes les instances de sa classe qui sont définies (ou accessibles) dans ladite méthode.

int compte::method(compte c) {
   int d = (solde - c.solde) ; // OK
   compte *tmp = new compte ;
   tmp->solde = solde ; // OK
   ...
}

Remettre un exemple avec les structures et unions comportant des fonctions membres.


Classes-I  10


Exemples de fonctions membres


Classes-I  11


Constructeur/Destructeur de classe






Classes-I  12




Classes-I : Constructeur (1)


Classes-I  13




Constructeur (2)

Déclaration
class String {
   int len ; char * pt ;
public:
   String(int l=0) { // Constr. 1
      len = l;
      pt = new char[l+1]; pt[0]='\0';
   }
   String(const char *) ; // Constr. 2
};

Définition
String::String(const char * ch) {
   len = strlen(ch);
   pt = new char[len+1];
   strcpy(pt,ch);
}

Utilisation
String s=3, s1(10); // Appel de Constr. 1
String s2("bonjour"); // Appel de Constr. 2
String s3="hello"; // Appel de Constr. 2
int i(1), j=3; // Constr. type prédéfini


Classes-I  14


Constructeur et données membres

class compte {
   int solde ;
   String nom_proprio ;
public:
   compte(int depot=0) {
      solde = depot ;
   }
};
...
compte c ;
// appel du constr. de String (pour
// nom_proprio) puis du constr. de compte


Classes-I  15


Liste d'initialisation d'un constructeur


Classes-I  16


Constructeurs implicites

class Point {
   int x, y;
};
int main(void) {
   Point p0 ; // Constructeur ss argument
   Point p1(p0); // Construction de p1 par
   // recopie membre à membre de p0
   Point p2 = p0; // idem que p1
   ...
}

Classes-I  17




Classes-I: Destructeur (1)


Classes-I  18




Destructeur (2)

Exemple

class String {
   int len; char * pt ;
public:
   String(char *st) {
      len = strlen(st) ;
   // alloc. tab[len+1] de char
      pt = new char[len+1] ;
      strcpy(pt,st) ; // recopie
   }
// libération de la mémoire occupée par pt
   ~String() { delete [] pt; }
} ;


Classes-I  19


Destructeur et données membres

class compte {
   int solde ;
   String nom_proprio ;
public:
   compte(char *) ;
   ~compte() ;
   ...
} ;
...
compte *c = new compte("Paul") ;
...
delete c ; // appel du destructeur de compte,
// puis de celui de String pour nom_proprio




Next Contents