Previous Next Contents




Classes-II : sommaire


Classes-II  1


Relation d'amitié

Classes-II  2




Fonction amie




Déclaration
class compte {
   friend void print(const compte&);
public :
   ...
};

Définition
void print(const compte& c) {
   cout << c.nom_proprio << ":" ;
   cout << c.solde << endl;
}
// Exemple fictif à ne pas suivre :
// Ici, print() devrait être membre
// de la classe compte...


Classes-II  3


Classe amie (1)




class Banque ; // déclaration anticipée
class compte {
   friend class Banque ;
   ...
};
class Banque {
   ...
};

Classes-II  4


Classe amie (2)

class compte {
   friend void Banque::fraisgestion(compte&, int) ;
   ...
};
class Banque {
public:
   void fraisgestion(compte&, int) ;
   ...
};
void Banque::fraisgestion(compte& c,int val)
{
   c.solde -= val; // accès à la donnée privée ``solde''
}


Classes-II  5


Membres de classe (suite)



Classes-II  6


Fonction membre constante (1)


Classes-II  7


Fonction membre constante (2)

class compteur {
   int valeur ;
public :
   compteur(int v=0) {valeur = v ;}
   int get(void) const { return valeur; };
   int badget(void) { return valeur; }
   int worseget(void) const;
   void set(int v) { valeur = v; }
};
int compteur::worseget(void) const {
   set(5); // Erreur de compil. !
   return valeur;
}
int main(void) {
   int i; compteur c1; const compteur c2(10);
   c2.set(1) ; // Erreur : c2 constant
   c1.set(1) ; // OK
   c2.get() ; // OK
   c2.badget(); // Erreur de compil. !
}


Classes-II  8


Fonction membre expansée

class compte {
   int solde ;
   ...
public :
   int getSolde(void) const { // déf. expansée
    return solde ; }
   void retirer(int montant);
   ...
};
inline void compte::retirer(int montant)
   { solde -= montant ; }


Classes-II  9


Donnée membre statique

class compte { ...
   static int nextNumero ;
   int numero; ...
};
compte::compte(char * nom) {
   numero = (nextNumero++); ...
}
int compte::nextNumero = 1 ; // initialisation


Classes-II  10


Fonction membre statique (1)


Classes-II  11


Fonction membre statique (2)

Déclaration
class compte {
   static int nextNumero ;
   ...
public :
   static void setNext(int x) ;
   ...
};

Définition
static void compte::setNext(int x) {
   nextNumero = x ;
}

Utilisation
int compte::nextNumero = 0;
// ...
compte::setNext(100); // OK car publique


Classes-II  12


Exemple : compte.h

#ifndef COMPTE_H
#define COMPTE_H
#include "String.h"
class compte {
public :
    compte(const String& nom);
    ~compte() ;
    int getSolde(void) const ;
    String proprio(void) const {
    return nom_proprio ; }
    void deposer(int som) ;
    void retirer(int som) ;
private :
    int solde ;
    const String& nom_proprio ;
    const int numero ;
    static int nextNumero;
    static int nbComptes;
} ;
#endif


Classes-II  13


Exemple : compte.cpp

#include "compte.h"
compte::nextNumero = 1;
compte::nbComptes = 0;
compte::compte(const string& nom) : solde(0),
   nom_proprio(nom), numero(nextNumero++)
   { nbComptes++ ; }
compte::~compte() { nbComptes--; }
inline int compte::getSolde(void) const
   { return solde ; }
void compte::deposer(int som)
   { solde += som; }
void compte::retirer(int som)
   { solde -= som ; }


Classes-II  14


Le pointeur `this'
int compte::method(...) {
   // solde == this->solde
   compte tmp = *this;
   ...
}


Classes-II  15


Pointeur sur fonction membre

int (String::*) ptMet (char) ;
// ptMet est un pointeur vers une méthode
// de la classe String

Pointeur sur donnée membre
int compte::* pt ;
// pt est un pointeur vers attribut
// de type int de la classe compte


Classes-II  16




class Table; // déclaration anticipée
typedef void (Table::* PtMet) (unsigned);
class Table {
public:
   Table(unsigned, unsigned);
   void up(unsigned n = 1) ;
   void down(unsigned n = 1) ;
   void left(unsigned n = 1) ;
   void right(unsigned n = 1) ;
   void move(int, PtMet, int, PtMet);
private:
   unsigned int x,y; // };
void Table::move(int m, PtMet h, int n, PtMet l) {
   (this->*h)(m); (this->*l)(n); }
void func2(unsigned) ;
void (* ptf) (unsigned) ;
void (Table::*ptfc) (unsigned) ;
ptf = &func2; // ok
ptf = &Table::up; // Erreur
ptfc = &func2; // Erreur
ptfc = &Table::up; // ok
Table b(1,1);
b.*ptfc(1);
b.move(1,&Table::up,1,&Table::left) ;


Classes-II  17


Pointeur sur fonction membre statique


Classes-II  18


Constructeur par recopie (1)


Classes-II  19


Constructeur par recopie (2)

Exemple
class String {
private:
   int len ; char * pt ;
public:
   String(char *st) {
    len = strlen(st);
    pt = new char[len+1];
    strcpy(pt, st);
   }
};
String s1("toto"); // º s1="toto";
String s2 = s1; // º s2(s1);
// recopie bit à bit
// Þ s1 et s2 partagent le même pointeur!
ß
ajouter le constructeur :
String::String(const String& s) : len(s.len) {
   pt = new char[len+1]; // alloc. nouv. espace
   strcpy(pt,s.pt); // recopie
}


Classes-II  20


Constructeurs et conversion de type


Classes-II  21


Passage d'arguments

Classes-II  22


Résultats d'une fonction membre




Previous Next Contents