8Q SHWLW WRXU GX &
                                  'LGLHU 'RQVH]

                                   ,679  89+

                           GRQVH]#XQLYYDOHQFLHQQHVIU




Didier DONSEZ 1995-1998          Un petit tour du C++             1

                                http://krimo666.mylivepage.com/
RPELQDLVRQ GH IRQFWLRQQDOLWpV
ODQJDJH 
      - Performances
           SURJUDPPDWLRQ VVWqPH



ODQJDJH $'$
      Concept de Généricité et de Modularité

      Surcharge

ODQJDJH 22
      Héritage Statique (simple et multiple)

      Spécialisation - Généralisation - Abstraction
           6PDOOWDON 2EM/LVS (LIIHO 2EMHFWLYH -DYD« HW ELHQ V€U 


Didier DONSEZ 1995-1998              Un petit tour du C++                   2

                                     http://krimo666.mylivepage.com/
OD VQWD[H GH EDVH  OH ODQJDJH 

VQWD[WH FODVVLTXH
      type de base
               (char, int, long, float, double, unsigned ....)

      type constructeur
               (array [], struct, union)

      opérateurs, expressions, blocs, structures de contrôle
              (if, switch, while, for )

      fonctions
                  (bibliothéque d'entrée/sortie)




Didier DONSEZ 1995-1998                 Un petit tour du C++              3

                                        http://krimo666.mylivepage.com/
([WHQVLRQ GX ODQJDJH 
      référence 
           QRPPDJH PXOWLSOH G
XQ REMHW
   int a;
   int abis = a;

           VLPSOLILFDWLRQ G
pFULWXUH SRXU SDUDPrWUHV SDU YDULDEOH
   int   inc_ptr(int* i) { return ++(*i); }
   int   b,c;
   c =   inc_ptr(b);
   int   inc_ref(int i) { return ++i; }
   c =   inc_ref(b) ;

      surcharge de fonctions
   void print( int ) { ... };
   void print( double ) { ... };
   void print( char* ) { ... };

      fonction inline
   inline int increment(int a) { return ++a; }
   #define INCREMENT(A) (++(A))

Didier DONSEZ 1995-1998            Un petit tour du C++             4

                                  http://krimo666.mylivepage.com/
$SSRUW GH ODQJDJH 22 
                            OHV FODVVHV G
REMHWV
      encapsulation des membres, manipulation au travers des méthodes.
   class Entreprise {
       // membres
     int nbEmployes
     Employe* listePersonnel[MAX_Pers];
   public:
       // constructeur/destructeur
     Entreprise();
     Entreprise(Entreprise*);
     ˜Entreprise();
   private:
       // méthodes
     void embauche(Employe*, int sal=SAL_SMIC)
     void debauche(Employe*);
     void debauche(Employe*, int primeDepart); //surcharge
   public:
       // méthodes d'opérateur
     Entreprise operator += (Employe* e)
     inline Entreprise operator -= (Employe* e)
                        { debauche(e); return *this; }
   }

Didier DONSEZ 1995-1998           Un petit tour du C++                   5

                                  http://krimo666.mylivepage.com/
'pFODUDWLRQV ,PEULTXpHV
   class List {
     class Element { public: ...
       give(Obj o);
     };
   public:
     insert(Obj o);
   };
   class List {
     class Element { public: ...
       alloc(Obj o);
     };
   public:
     insert(Obj o);
   };
   Array::Element::give(Obj o) { ... }
   List::Element::alloc(Obj o) { ... }

   class Process { public:
      enum Status { IDLE, RUNNING };
       Status st;
       ...
   };
   schedule() {
       Process::Status st = IDLE;
       ...
   }

Didier DONSEZ 1995-1998            Un petit tour du C++              6

                                   http://krimo666.mylivepage.com/
$SSRUW GH ODQJDJH 22 
                          PDQLSXODWLRQ GHV REMHWV
   main() {
   Entreprise IBM; // constructeur 1
   Entreprise* Bell = new Entreprise; // ex-malloc + constructeur 1
   Employe durant;
   Employe* p_durant = durant
   Employe martin;

   IBM.embauche(p_durant);
   IBM -= p_durant;
   Bell-embauche(p_durant);
   (Bell) += martin;

   Entreprise ATT(Bell); // constructeur 2
                          // instanciation au milieu du code
   delete Bell; // desallocateur + destructeur
   ATT -= p_durant; //
   } // en sortie de bloc
     // destructeur ˜Entreprise() pour IBM, ATT
     // destructeur ˜Employe() pour durant, martin



Didier DONSEZ 1995-1998          Un petit tour du C++                 7

                                 http://krimo666.mylivepage.com/
RQVWUXFWHXUV 'HVWUXFWHXU
RQVWUXFWHXUV 0ODVV
MyClass() est généré par défaut mais il peut être surchargé

      Il est invoqué lors de la déclaration des variables locales (et paramêtres) et par
        l'opérateur MyClass::new()

      NB : MyClass(MyClass) peut être invoqué lors d'une affectation

'HVWUXFWHXU a0ODVV
généré par défaut mais il peut être surchargé une seule fois

      Il est invoqué sur les variables locales (et paramêtres) à la sortie d'un bloc (ou de la
        fonction) et par l'opérateur MyClass::delete()




Didier DONSEZ 1995-1998               Un petit tour du C++                            8

                                      http://krimo666.mylivepage.com/
$OORFDWHXU 'pVDOORFDWHXU
$OORFDWHXU RSHUDWRU 0ODVVQHZ
généré par défaut mais il peut être surchargé

$OORFDWHXU RSHUDWRU QHZ
l'opérateur ::new() est l'allocateur globale
      il existe par défaut mais il peut être surchargé

'pVDOORFDWHXU RSHUDWRU 0ODVVGHOHWH
généré par défaut mais il peut être surchargé

'pVDOORFDWHXU RSHUDWRU GHOHWH
l'opérateur ::delete() est l'allocateur globale

      il existe par défaut mais il peut être surchargé




Didier DONSEZ 1995-1998                Un petit tour du C++              9

                                       http://krimo666.mylivepage.com/
RQVWUXFWHXUV 'HVWUXFWHXU
      $OORFDWHXU 'pVDOORFDWHXU ([HPSOH
class Str { public:
     char* cs;
     Str()         { cs=(char*)NIL; };
     Str(char* cs) {
       this-cs=new char[strlen(cs)+1]; strcpy(this-cs,cs);};
     Str(const Str s){
       if(this-cs!=(char*)NIL) delete this-cs;
       this-cs=new char[strlen(s.cs)+1]; strcpy(this-cs,cs.s);};
     ~Str()        { if(this-cs!=(char*)NIL) delete this-cs; };
   };

   Str func(Str p){        // Str::Str(const Str) pour p
     Str v1;                // Str::Str() pour v1
     ...
     {
        Str v2(v1);         // Str::Str(const Str) pour v2
        Str v3 = v2;        // Str::Str(const Str) pour v3
       ...
     }                      // Str::~Str pour v3, v2
     ...
   }                        // Str::~Str pour v1, p
   int main(){    Str m1(toto);    // Str::Str(char*) pour m1
                  Str m2 = func(m1); // Str::Str(const Str) pour m2
   }

Didier DONSEZ 1995-1998           Un petit tour du C++                 10

                                  http://krimo666.mylivepage.com/
2SpUDWHXUV
      Définition des Opérateurs
          PpWKRGHV DSSHOpHV DYHF XQH IRUPH VQWD[LTXH DOJpEULTXH
   class Obj;
   class ListObj { public: ...
                 ListObj();
                 ListObj(const ListObj);
      ListObj   operator =(const ListObj);
      ListObj   operator +=(const ListObj);
      ListObj   operator +=(const Obj);
      const Obj operator [](long);
   };

   ListObj operator + (const ListObj, const ListObj );

      Utilisation des Opérateurs
   ListObj l2, l3;
   ListObj   l1(l3); //     ListObj(const ListObj);
                   // vs ListObj();l1.operator=(l3);
   l1 += l2;    // l1.operator+=( l2 )
   l1 += l3[0];    // l1.operator+=( l3.operator[](0) )
   l1 = l2 + l3; // l1.operator=( operator+(l2,l3) );

Didier DONSEZ 1995-1998            Un petit tour du C++              12

                                   http://krimo666.mylivepage.com/
+pULWDJHV 6LPSOH HW 0XOWLSOH
                      OHV RQVWUXFWHXUV
class Person { public:
        char* nom;
     Person(char* nom) {
        this-nom = new char[strlen(nom)+1];
        strcpy(this-nom, nom);
    };
   }
class Etudiant : public Person { public:
        char* etude;
     Etudiant (char* nom, char* etu) : Person(nom) {
        etude = new char[strlen(nom)+1];
        strcpy( etude, etu);
     };
   }
class Employe : public Person { public:
        int echelon;
     Employe(char* nom, int ech) : Person(nom), echelon(ech) {};
   }
class Etudiant_en_FormCont: public Etudiant, virtual public Employe {
    public:
     Etudiant_en_FormCont(char* nom, char* etu, int ech)
        : Etudiant(nom,etu), Employe(nom, ech) {};
   }


Didier DONSEZ 1995-1998          Un petit tour du C++                   13

                                 http://krimo666.mylivepage.com/
0pWKRGHV 9LUWXHOOHV
                          0pWKRGHV QRQ 9LUWXHOOHV
   class Person { public:
       char* nom;
       virtual    printVIRT() { cout  nom;};
                  print()     { cout  nom;};
   };
   class Employe : public Person { public:
       int echelon;
       virtual printVIRT() { Person::printVIRT(); cout  echelon; };
               print()      { Person::print();      cout  echelon; };
               print2()         { Employe::print(); };
   };

   f(){
           Employe Bill;
           Employe e =  Bill;
           Person p = e;     // Person p =  Bill;

           e-printVIRT();   // Employe::printVIRT()
           e-print();          // Employe::print()
           e-print2();         // Employe::print2()
           p-printVIRT();   // Employe::printVIRT() (abstraction)
           p-print();          // Person::print()
           p-print2();         // Erreur de Compilation
   }

Didier DONSEZ 1995-1998             Un petit tour du C++                  14

                                   http://krimo666.mylivepage.com/
+pULWDJH 0XOWLSOH HW 0pWKRGHV
  class Person { public:
       char* nom;
     virtual print() { cout  nom;};
  }
class Employe : public Person { public:
       int echelon;
     virtual print() {            // spécialisation
             Person::print();
             cout  echelon;
   };
  }
class Etudiant : public Person { public:
       char* etude;
     virtual print() {            // spécialisation
             Person::print();
             cout  etude;
   };
  }
class Etudiant_en_FormCont: public Etudiant, virtual public Employe {
    public:
     virtual print() {      Etudiant::print();
                         Employe::print();
   };

Didier DONSEZ 1995-1998      Un petit tour du C++                 15

                             http://krimo666.mylivepage.com/
ODVVHV $EVWUDLWHV SXUH YLUWXDO
pas d’instanciation possible pour ces classes
   class Figure {         public:
      virtual void        draw()=0;
   };
   class Circle :         public Figure {
      virtual void        draw() { ... };
   };

   Figure fig;             // KO
   Circle circle;          // OK


           5HPDUTXH GpILQLWLRQ RSWLRQHOOH GH Figure::draw()




Didier DONSEZ 1995-1998               Un petit tour du C++              16

                                      http://krimo666.mylivepage.com/
RQWU{OH G
$FFHV ,  'pILQLWLRQ
Private (défaut)
           VHXOHPHQW
            PpWKRGHV PHPEUHV
            LQLWLDOLVHXUV GH OD FODVVH
            PpWKRGHV IULHQG

      Protected
           HQ SOXV
            PpWKRGHV PHPEUHV G
XQH FODVVH GpULYpH

      Public
             WRXWHV PpWKRGHV RX IRQFWLRQV




Didier DONSEZ 1995-1998             Un petit tour du C++              17

                                    http://krimo666.mylivepage.com/
RQWU{OH G
$FFHV ,,  8WLOLVDWLRQ
class Base {                              class Derive : public Base {
       private:                                    int   d();
         int    a;                               protected:
       protected:                                  int   e;
         int    b();                             public:
       public:                                     int   f;
         int    c;                            };
       private:
         int    g();
    };

Base::g() {               Derive::g() {                      f(Base bs, Derive
  a++; // OK                a++; // OK                       dr){
  b(); // OK                b(); // OK                         bs.a++; // Error
  c++; // OK                c++; // OK                         bs.b(); // Error
}                                                              bs.c++; // OK
                              d();   // OK
                              e++;   // OK                        dr.d();   // Error
                              f++;   // OK                        dr.e++;   // Error
                          }                                       dr.f++;   // OK
                                                             }




Didier DONSEZ 1995-1998          Un petit tour du C++                              18

                                http://krimo666.mylivepage.com/
RQWU{OH G
$FFHV ,,,  +HULWDJH
class Base {                      class Derive                      class DD : Derive {
  private:   int          a;         : XXXXX Base {                   fDD(Derive);
  protected: int          b();                 int   d();           };
  public:    int          c;        protected int    e;
  private:   int          g();      public:    int   f;
};                                };
XXXXX = public                      XXXXX = protected                    XXXXX = private

DD::fDD(Derive dr){              DD::fDD(Derive dr){              DD::fDD(Derive dr){
  dr.a++; // Error                  dr.a++; // Error                  dr.a++; // Error
  dr.b(); // OK                     dr.b(); // OK                     dr.b(); // Error
  dr.c++; // OK                     dr.c++; // OK                     dr.c++; // Error
}                                 }                                 }
f(Derive dr){                    f(Derive dr){                    f(Derive dr){
  dr.a++; // Error                  dr.a++; // Error                  dr.a++; // Error
  dr.b(); // Error                  dr.b(); // Error                  dr.b(); // Error
  dr.c++; // OK                     dr.c++; // Error                  dr.c++; // Error
}                                 }                                 }

   la classe Derive rend public    la classe Derive rend public               la classe Derive
        le contrôle d'accès             le contrôle d'accès                 ne rend pas public
        de sa super-classe              de sa super-classe                  le contrôle d'accès
              à tous                        uniquement                      de sa super-classe
                                    à ses sous classes et aux
                                              friends
Didier DONSEZ 1995-1998                 Un petit tour du C++                                      19

                                       http://krimo666.mylivepage.com/

Tour C++

  • 1.
    8Q SHWLW WRXUGX & 'LGLHU 'RQVH] ,679 89+ GRQVH]#XQLYYDOHQFLHQQHVIU Didier DONSEZ 1995-1998 Un petit tour du C++ 1 http://krimo666.mylivepage.com/
  • 2.
    RPELQDLVRQ GH IRQFWLRQQDOLWpV ODQJDJH - Performances SURJUDPPDWLRQ VVWqPH ODQJDJH $'$ Concept de Généricité et de Modularité Surcharge ODQJDJH 22 Héritage Statique (simple et multiple) Spécialisation - Généralisation - Abstraction 6PDOOWDON 2EM/LVS (LIIHO 2EMHFWLYH -DYD« HW ELHQ V€U Didier DONSEZ 1995-1998 Un petit tour du C++ 2 http://krimo666.mylivepage.com/
  • 3.
    OD VQWD[H GHEDVH OH ODQJDJH VQWD[WH FODVVLTXH type de base (char, int, long, float, double, unsigned ....) type constructeur (array [], struct, union) opérateurs, expressions, blocs, structures de contrôle (if, switch, while, for ) fonctions (bibliothéque d'entrée/sortie) Didier DONSEZ 1995-1998 Un petit tour du C++ 3 http://krimo666.mylivepage.com/
  • 4.
    ([WHQVLRQ GX ODQJDJH référence QRPPDJH PXOWLSOH G XQ REMHW int a; int abis = a; VLPSOLILFDWLRQ G pFULWXUH SRXU SDUDPrWUHV SDU YDULDEOH int inc_ptr(int* i) { return ++(*i); } int b,c; c = inc_ptr(b); int inc_ref(int i) { return ++i; } c = inc_ref(b) ; surcharge de fonctions void print( int ) { ... }; void print( double ) { ... }; void print( char* ) { ... }; fonction inline inline int increment(int a) { return ++a; } #define INCREMENT(A) (++(A)) Didier DONSEZ 1995-1998 Un petit tour du C++ 4 http://krimo666.mylivepage.com/
  • 5.
    $SSRUW GH ODQJDJH22 OHV FODVVHV G REMHWV encapsulation des membres, manipulation au travers des méthodes. class Entreprise { // membres int nbEmployes Employe* listePersonnel[MAX_Pers]; public: // constructeur/destructeur Entreprise(); Entreprise(Entreprise*); ˜Entreprise(); private: // méthodes void embauche(Employe*, int sal=SAL_SMIC) void debauche(Employe*); void debauche(Employe*, int primeDepart); //surcharge public: // méthodes d'opérateur Entreprise operator += (Employe* e) inline Entreprise operator -= (Employe* e) { debauche(e); return *this; } } Didier DONSEZ 1995-1998 Un petit tour du C++ 5 http://krimo666.mylivepage.com/
  • 6.
    'pFODUDWLRQV ,PEULTXpHV class List { class Element { public: ... give(Obj o); }; public: insert(Obj o); }; class List { class Element { public: ... alloc(Obj o); }; public: insert(Obj o); }; Array::Element::give(Obj o) { ... } List::Element::alloc(Obj o) { ... } class Process { public: enum Status { IDLE, RUNNING }; Status st; ... }; schedule() { Process::Status st = IDLE; ... } Didier DONSEZ 1995-1998 Un petit tour du C++ 6 http://krimo666.mylivepage.com/
  • 7.
    $SSRUW GH ODQJDJH22 PDQLSXODWLRQ GHV REMHWV main() { Entreprise IBM; // constructeur 1 Entreprise* Bell = new Entreprise; // ex-malloc + constructeur 1 Employe durant; Employe* p_durant = durant Employe martin; IBM.embauche(p_durant); IBM -= p_durant; Bell-embauche(p_durant); (Bell) += martin; Entreprise ATT(Bell); // constructeur 2 // instanciation au milieu du code delete Bell; // desallocateur + destructeur ATT -= p_durant; // } // en sortie de bloc // destructeur ˜Entreprise() pour IBM, ATT // destructeur ˜Employe() pour durant, martin Didier DONSEZ 1995-1998 Un petit tour du C++ 7 http://krimo666.mylivepage.com/
  • 8.
  • 9.
    MyClass() est générépar défaut mais il peut être surchargé Il est invoqué lors de la déclaration des variables locales (et paramêtres) et par l'opérateur MyClass::new() NB : MyClass(MyClass) peut être invoqué lors d'une affectation 'HVWUXFWHXU a0ODVV
  • 10.
    généré par défautmais il peut être surchargé une seule fois Il est invoqué sur les variables locales (et paramêtres) à la sortie d'un bloc (ou de la fonction) et par l'opérateur MyClass::delete() Didier DONSEZ 1995-1998 Un petit tour du C++ 8 http://krimo666.mylivepage.com/
  • 11.
  • 12.
    généré par défautmais il peut être surchargé $OORFDWHXU RSHUDWRU QHZ
  • 13.
    l'opérateur ::new() estl'allocateur globale il existe par défaut mais il peut être surchargé 'pVDOORFDWHXU RSHUDWRU 0ODVVGHOHWH
  • 14.
    généré par défautmais il peut être surchargé 'pVDOORFDWHXU RSHUDWRU GHOHWH
  • 15.
    l'opérateur ::delete() estl'allocateur globale il existe par défaut mais il peut être surchargé Didier DONSEZ 1995-1998 Un petit tour du C++ 9 http://krimo666.mylivepage.com/
  • 16.
    RQVWUXFWHXUV 'HVWUXFWHXU $OORFDWHXU 'pVDOORFDWHXU ([HPSOH
  • 17.
    class Str {public: char* cs; Str() { cs=(char*)NIL; }; Str(char* cs) { this-cs=new char[strlen(cs)+1]; strcpy(this-cs,cs);}; Str(const Str s){ if(this-cs!=(char*)NIL) delete this-cs; this-cs=new char[strlen(s.cs)+1]; strcpy(this-cs,cs.s);}; ~Str() { if(this-cs!=(char*)NIL) delete this-cs; }; }; Str func(Str p){ // Str::Str(const Str) pour p Str v1; // Str::Str() pour v1 ... { Str v2(v1); // Str::Str(const Str) pour v2 Str v3 = v2; // Str::Str(const Str) pour v3 ... } // Str::~Str pour v3, v2 ... } // Str::~Str pour v1, p int main(){ Str m1(toto); // Str::Str(char*) pour m1 Str m2 = func(m1); // Str::Str(const Str) pour m2 } Didier DONSEZ 1995-1998 Un petit tour du C++ 10 http://krimo666.mylivepage.com/
  • 18.
    2SpUDWHXUV Définition des Opérateurs PpWKRGHV DSSHOpHV DYHF XQH IRUPH VQWD[LTXH DOJpEULTXH class Obj; class ListObj { public: ... ListObj(); ListObj(const ListObj); ListObj operator =(const ListObj); ListObj operator +=(const ListObj); ListObj operator +=(const Obj); const Obj operator [](long); }; ListObj operator + (const ListObj, const ListObj ); Utilisation des Opérateurs ListObj l2, l3; ListObj l1(l3); // ListObj(const ListObj); // vs ListObj();l1.operator=(l3); l1 += l2; // l1.operator+=( l2 ) l1 += l3[0]; // l1.operator+=( l3.operator[](0) ) l1 = l2 + l3; // l1.operator=( operator+(l2,l3) ); Didier DONSEZ 1995-1998 Un petit tour du C++ 12 http://krimo666.mylivepage.com/
  • 19.
    +pULWDJHV 6LPSOH HW0XOWLSOH OHV RQVWUXFWHXUV
  • 20.
    class Person {public: char* nom; Person(char* nom) { this-nom = new char[strlen(nom)+1]; strcpy(this-nom, nom); }; } class Etudiant : public Person { public: char* etude; Etudiant (char* nom, char* etu) : Person(nom) { etude = new char[strlen(nom)+1]; strcpy( etude, etu); }; } class Employe : public Person { public: int echelon; Employe(char* nom, int ech) : Person(nom), echelon(ech) {}; } class Etudiant_en_FormCont: public Etudiant, virtual public Employe { public: Etudiant_en_FormCont(char* nom, char* etu, int ech) : Etudiant(nom,etu), Employe(nom, ech) {}; } Didier DONSEZ 1995-1998 Un petit tour du C++ 13 http://krimo666.mylivepage.com/
  • 21.
    0pWKRGHV 9LUWXHOOHV 0pWKRGHV QRQ 9LUWXHOOHV class Person { public: char* nom; virtual printVIRT() { cout nom;}; print() { cout nom;}; }; class Employe : public Person { public: int echelon; virtual printVIRT() { Person::printVIRT(); cout echelon; }; print() { Person::print(); cout echelon; }; print2() { Employe::print(); }; }; f(){ Employe Bill; Employe e = Bill; Person p = e; // Person p = Bill; e-printVIRT(); // Employe::printVIRT() e-print(); // Employe::print() e-print2(); // Employe::print2() p-printVIRT(); // Employe::printVIRT() (abstraction) p-print(); // Person::print() p-print2(); // Erreur de Compilation } Didier DONSEZ 1995-1998 Un petit tour du C++ 14 http://krimo666.mylivepage.com/
  • 22.
    +pULWDJH 0XOWLSOH HW0pWKRGHV class Person { public: char* nom; virtual print() { cout nom;}; } class Employe : public Person { public: int echelon; virtual print() { // spécialisation Person::print(); cout echelon; }; } class Etudiant : public Person { public: char* etude; virtual print() { // spécialisation Person::print(); cout etude; }; } class Etudiant_en_FormCont: public Etudiant, virtual public Employe { public: virtual print() { Etudiant::print(); Employe::print(); }; Didier DONSEZ 1995-1998 Un petit tour du C++ 15 http://krimo666.mylivepage.com/
  • 23.
  • 24.
    pas d’instanciation possiblepour ces classes class Figure { public: virtual void draw()=0; }; class Circle : public Figure { virtual void draw() { ... }; }; Figure fig; // KO Circle circle; // OK 5HPDUTXH GpILQLWLRQ RSWLRQHOOH GH Figure::draw() Didier DONSEZ 1995-1998 Un petit tour du C++ 16 http://krimo666.mylivepage.com/
  • 25.
    RQWU{OH G $FFHV , 'pILQLWLRQ
  • 26.
    Private (défaut) VHXOHPHQW PpWKRGHV PHPEUHV LQLWLDOLVHXUV GH OD FODVVH PpWKRGHV IULHQG Protected HQ SOXV PpWKRGHV PHPEUHV G XQH FODVVH GpULYpH Public WRXWHV PpWKRGHV RX IRQFWLRQV Didier DONSEZ 1995-1998 Un petit tour du C++ 17 http://krimo666.mylivepage.com/
  • 27.
    RQWU{OH G $FFHV ,, 8WLOLVDWLRQ
  • 28.
    class Base { class Derive : public Base { private: int d(); int a; protected: protected: int e; int b(); public: public: int f; int c; }; private: int g(); }; Base::g() { Derive::g() { f(Base bs, Derive a++; // OK a++; // OK dr){ b(); // OK b(); // OK bs.a++; // Error c++; // OK c++; // OK bs.b(); // Error } bs.c++; // OK d(); // OK e++; // OK dr.d(); // Error f++; // OK dr.e++; // Error } dr.f++; // OK } Didier DONSEZ 1995-1998 Un petit tour du C++ 18 http://krimo666.mylivepage.com/
  • 29.
  • 30.
    class Base { class Derive class DD : Derive { private: int a; : XXXXX Base { fDD(Derive); protected: int b(); int d(); }; public: int c; protected int e; private: int g(); public: int f; }; }; XXXXX = public XXXXX = protected XXXXX = private DD::fDD(Derive dr){ DD::fDD(Derive dr){ DD::fDD(Derive dr){ dr.a++; // Error dr.a++; // Error dr.a++; // Error dr.b(); // OK dr.b(); // OK dr.b(); // Error dr.c++; // OK dr.c++; // OK dr.c++; // Error } } } f(Derive dr){ f(Derive dr){ f(Derive dr){ dr.a++; // Error dr.a++; // Error dr.a++; // Error dr.b(); // Error dr.b(); // Error dr.b(); // Error dr.c++; // OK dr.c++; // Error dr.c++; // Error } } } la classe Derive rend public la classe Derive rend public la classe Derive le contrôle d'accès le contrôle d'accès ne rend pas public de sa super-classe de sa super-classe le contrôle d'accès à tous uniquement de sa super-classe à ses sous classes et aux friends Didier DONSEZ 1995-1998 Un petit tour du C++ 19 http://krimo666.mylivepage.com/
  • 31.
  • 32.
    Friend IRQFWLRQ DPLH FODVVH DPLH DXWRULVH OHV DFFqV SULYDWH HW SURWHFWHG DX[ IRQFWLRQV QRQ PHPEUHV class Matrix { Vector Diagonal(); }; class Vector { private: friend class Matrix; friend Matrix multiple(Matrix,Vector); int size; }; Vector Matrix::Diagonal() { .. = size; } Matrix multiple(Matrix m,Vector v) { .. = size; } Didier DONSEZ 1995-1998 Un petit tour du C++ 20 http://krimo666.mylivepage.com/
  • 33.
    RQVW class Obj { friend g(const Obj); int i; public: f(); f_CONST() const; }; g(const Obj* o) { cout o-i; // OK o-i++; // Erreur ((Obj*)o)-i++; // OK } main() { Obj* o = new Obj; const Obj* oc = o; // OK Obj* onc = oc; // Erreur Obj* onc2 = (Obj*)o; // OK o-f(); // Erreur o-f_CONST(); // OK } Didier DONSEZ 1995-1998 Un petit tour du C++ 21 http://krimo666.mylivepage.com/
  • 34.
    *pQpULFLWp FODVVHVSDUDPpWUpHV Déclaration template class T class List { struct Element { public: T* value; Element* next; }; Element* first; public: ListT(); ListT(const ListT); ListT operator =(const ListT); ListT operator +=(const ListT); ListT operator +=(const T); const T operator [](long); }; ListT operator + (const ListT, const ListT ); Utilisation Listint li; li += 1; cout li[0]; Listdouble ld; ld += 3.1416; ListEmploye mcrosft; mcrosft += new Employe(“Bill”); ListPerson wldcny; wldcny += mcrosft; Didier DONSEZ 1995-1998 Un petit tour du C++ 22 http://krimo666.mylivepage.com/
  • 35.
    ([FHSWLRQV Traitement des erreurs dans un langage séquentiel err_t fn( res_t r ) { ... if(...){ r = result; return OK; } else return KO; } for(i=0; (err=fn(i))==OK iMAX; i++ ) {} if(err==KO) { traitement d’erreur } Execptions C++: mécanisme alternatif de traitement des erreurs “synchrones” • simplification du code de l’application QRWDQPHQW DX QLYHDX GHV FRQVWUXFWHXUV • efficacité SDUIRLV VL 0$; JUDQG • récupération d’une erreur “levée” dans une fonction de bibliothèque Didier DONSEZ 1995-1998 Un petit tour du C++ 23 http://krimo666.mylivepage.com/
  • 36.
    ([FHSWLRQV 0pFDQLVPH Définition class MathError{}; class DivideZero : MathError {}; class Overflow : MathError { char* _str; Overflow(char* str); }; double add(double d1; double d2) { ... if(...) throw Overflow(“+”); } f(){ try { add(maxdouble, maxdouble); // raise Overflow } catch(DivideZero) { // traitement pour DivideZero } } g(){ try { f(); } catch(Overflow o) { cerr “Overflow sur “ o._str; exit(); } catch(MathError) { // traitement pour MathError et autres dérivés }} Didier DONSEZ 1995-1998 Un petit tour du C++ 24 http://krimo666.mylivepage.com/
  • 37.
    0DQTXHV GDQV OH 5DPDVVH 0LHWWH 0pWD 0RGqOH 'QDPLF %LQGLQJ 0XOWL $FWLYLWp WKUHDG -DYD RX WDVN $'$
  • 38.
    Didier DONSEZ 1995-1998 Un petit tour du C++ 25 http://krimo666.mylivepage.com/
  • 39.
    OHV 5DPDVVHV 0LHWWH*DUEDJH ROOHFWRU
  • 40.
    Destruction explicite parl'opérateur de désallocation delete() 6PDOOWDON -DYD Destruction implicite quand l'instance n'est plus référencée par aucune autre instance QpFHVVLWH XQ 5DPDWWH 0LHWWH c.a.d. récupération des instances inaccessibles Techniques: Compteur de référence, Mark-and-Sweep, Incrémentale ... ELEOLRWKpTXH GH 5DPDVVHV 0LHWWH par héritage avec des techniques différentes classes par classes Didier DONSEZ 1995-1998 Un petit tour du C++ 26 http://krimo666.mylivepage.com/
  • 41.
    5DPDVVHV 0LHWWH H[HPSOH RPSWHXU GH 5pIpUHQFH
  • 42.
    template class CGCclass Ref { CGC* ptr; public: CGC* operator =(const CGC* t) { if(ptr) ptr-decref(); ptr = t; t-incref(); return ptr; }; }; class ObjectGC { int cpt; ObjectGC() : cpt(0) {} virtual ˜ObjectGC() {}; public: void incref() { cpt++; }; void decref() { if(--cpt==0) delete this; }; }; class MyClass : public ObjectGC { ... }; RefMyClass ref1 = new MyClass; // cpt==1 RefMyClass ref2 = ref1; // cpt==2 ref1 = 0; // cpt==1 ref2 = ref3; // cpt==0 Destruction effective Didier DONSEZ 1995-1998 Un petit tour du C++ 27 http://krimo666.mylivepage.com/
  • 43.
    0pWD ODVVHV RQVWUXFWLRQ GQDPLTXHGX VFKpPD Implantation difficile dans une approche compilé $SSOLFDWLRQV ,$ 'QDPLF %LQGLQJ $MRXW GHV ELEOLRWKqTXHV G REMHWV DX 5XQWLPH Dépend de système mais reste compliqué Objective-C (GNU) utilisé dans NeXTStep, Java dans la JVM $SSHO GH PpWKRGHV GLVWDQWHV RPC - OO, Corba 0XOWL $FWLYLWp 3DV GH VSpFLILFDWLRQ GH RURXWLQHV RX GH 7DFKHV GDQV OH ODQJDJH %XW 2EMHWV UpDFWLIV Didier DONSEZ 1995-1998 Un petit tour du C++ 28 http://krimo666.mylivepage.com/
  • 44.
    Solution: encapsuler deslibrairies système (pthread POSIX) si le système le permet Didier DONSEZ 1995-1998 Un petit tour du C++ 29 http://krimo666.mylivepage.com/
  • 45.
    RQFOXVLRQ *URV SRLQW IRUW O (IILFDFLWp GX 8Q VXU HQVHPEOH GH OD VQWD[H GX Apprentissage plus facile pour un programmeur C Migration incrémentale des applications C vers le C++ ([WHQVLEOH YLD GHV ELEOLRWKqTXHV Mais malheureusement très peu standardisée 8Q VWDQGDUG GH IDLW SRXU OH *pQLH /RJLFLHO grand nombre de compilateurs et AGL (public ou payant) choisi par l'OMG (Object Management Group - i.e. CORBA) SRXU OHV 6*'% 22 choisi par l'ODMG (Object Database Management Group) (3(1'$17 6XELW XQH WUqV IRUWH FRQFXUUHQFH GH OD SDUW GH -$9$ Didier DONSEZ 1995-1998 Un petit tour du C++ 30 http://krimo666.mylivepage.com/
  • 46.
    %LEOLRJUDSKLH (OOLV HW 6WURXVWUXS7KH $QQRWDWHG 5HIHUHQFH 0DQXDO $GGLVRQ:HOOH 3XEOLVKLQJ RPSDQ La sainte bible du developpeur C++ (en anglais) 6WURXVWUXS /H ODQJDJH une introduction pédagogique (en anglais et en français) 0DVVLQL /HV ODQJDJHV j 2EMHWV un bon panorama des langages objets (syntaxte et implantation) comp.object comp.std.c++ les derniers potins, les trucs, les FAQ, des tutoriaux ... Didier DONSEZ 1995-1998 Un petit tour du C++ 31 http://krimo666.mylivepage.com/