8Q SHWLW WRXU GX &                                  LGLHU RQVH]                                   ,679  89+               ...
RPELQDLVRQ GH IRQFWLRQQDOLWpVODQJDJH       - Performances           SURJUDPPDWLRQ VVWqPHODQJDJH $$      Concept de Généric...
OD VQWD[H GH EDVH  OH ODQJDJH VQWD[WH FODVVLTXH      type de base               (char, int, long, float, double, unsigned ...
([WHQVLRQ GX ODQJDJH       référence            QRPPDJH PXOWLSOH GXQ REMHW   int a;   int abis = a;           VLPSOLILFDWL...
$SSRUW GH ODQJDJH 22                             OHV FODVVHV GREMHWV      encapsulation des membres, manipulation au trave...
pFODUDWLRQV ,PEULTXpHV   class List {     class Element { public: ...       give(Obj o);     };   public:     insert(Obj o...
$SSRUW GH ODQJDJH 22                           PDQLSXODWLRQ GHV REMHWV   main() {   Entreprise IBM; // constructeur 1   En...
RQVWUXFWHXUV HVWUXFWHXURQVWUXFWHXUV 0ODVV
MyClass() est généré par défaut mais il peut être surchargé      Il est invoqué lors de la déclaration des variables local...
généré par défaut mais il peut être surchargé une seule fois      Il est invoqué sur les variables locales (et paramêtres)...
$OORFDWHXU pVDOORFDWHXU$OORFDWHXU RSHUDWRU 0ODVVQHZ
généré par défaut mais il peut être surchargé$OORFDWHXU RSHUDWRU QHZ
lopérateur ::new() est lallocateur globale      il existe par défaut mais il peut être surchargépVDOORFDWHXU RSHUDWRU 0ODV...
généré par défaut mais il peut être surchargépVDOORFDWHXU RSHUDWRU GHOHWH
lopérateur ::delete() est lallocateur globale      il existe par défaut mais il peut être surchargéDidier DONSEZ 1995-1998...
RQVWUXFWHXUV HVWUXFWHXU      $OORFDWHXU pVDOORFDWHXU ([HPSOH
class Str { public:     char* cs;     Str()         { cs=(char*)NIL; };     Str(char* cs) {       this-cs=new char[strlen(...
2SpUDWHXUV      Définition des Opérateurs          PpWKRGHV DSSHOpHV DYHF XQH IRUPH VQWD[LTXH DOJpEULTXH   class Obj;   cl...
+pULWDJHV 6LPSOH HW 0XOWLSOH                      OHV RQVWUXFWHXUV
class Person { public:        char* nom;     Person(char* nom) {        this-nom = new char[strlen(nom)+1];        strcpy(...
0pWKRGHV 9LUWXHOOHV                          0pWKRGHV QRQ 9LUWXHOOHV   class Person { public:       char* nom;       virtu...
+pULWDJH 0XOWLSOH HW 0pWKRGHV  class Person { public:       char* nom;     virtual print() { cout  nom;};  }class Employe ...
ODVVHV $EVWUDLWHV SXUH YLUWXDO
pas d’instanciation possible pour ces classes   class Figure {         public:      virtual void        draw()=0;   };   c...
RQWU{OH G$FFHV ,  pILQLWLRQ
Private (défaut)           VHXOHPHQW            PpWKRGHV PHPEUHV            LQLWLDOLVHXUV GH OD FODVVH            PpWKRGHV...
RQWU{OH G$FFHV ,,  8WLOLVDWLRQ
class Base {                              class Derive : public Base {       private:                                    i...
RQWU{OH G$FFHV ,,,  +HULWDJH
class Base {                      class Derive                      class DD : Derive {  private:   int          a;       ...
Prochain SlideShare
Chargement dans…5
×

Tour C++

339 vues

Publié le

Tour C++

Publié dans : Formation
0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
339
Sur SlideShare
0
Issues des intégrations
0
Intégrations
4
Actions
Partages
0
Téléchargements
8
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Tour C++

  1. 1. 8Q SHWLW WRXU GX & LGLHU RQVH] ,679 89+ GRQVH]#XQLYYDOHQFLHQQHVIUDidier DONSEZ 1995-1998 Un petit tour du C++ 1 http://krimo666.mylivepage.com/
  2. 2. RPELQDLVRQ GH IRQFWLRQQDOLWpVODQJDJH - Performances SURJUDPPDWLRQ VVWqPHODQJDJH $$ Concept de Généricité et de Modularité SurchargeODQJDJH 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. 3. 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 dentrée/sortie)Didier DONSEZ 1995-1998 Un petit tour du C++ 3 http://krimo666.mylivepage.com/
  4. 4. ([WHQVLRQ GX ODQJDJH référence QRPPDJH PXOWLSOH GXQ REMHW int a; int abis = a; VLPSOLILFDWLRQ GpFULWXUH 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. 5. $SSRUW GH ODQJDJH 22 OHV FODVVHV GREMHWV 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 dopé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. 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. 7. $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, martinDidier DONSEZ 1995-1998 Un petit tour du C++ 7 http://krimo666.mylivepage.com/
  8. 8. RQVWUXFWHXUV HVWUXFWHXURQVWUXFWHXUV 0ODVV
  9. 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 lopérateur MyClass::new() NB : MyClass(MyClass) peut être invoqué lors dune affectationHVWUXFWHXU a0ODVV
  10. 10. 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 dun bloc (ou de la fonction) et par lopérateur MyClass::delete()Didier DONSEZ 1995-1998 Un petit tour du C++ 8 http://krimo666.mylivepage.com/
  11. 11. $OORFDWHXU pVDOORFDWHXU$OORFDWHXU RSHUDWRU 0ODVVQHZ
  12. 12. généré par défaut mais il peut être surchargé$OORFDWHXU RSHUDWRU QHZ
  13. 13. lopérateur ::new() est lallocateur globale il existe par défaut mais il peut être surchargépVDOORFDWHXU RSHUDWRU 0ODVVGHOHWH
  14. 14. généré par défaut mais il peut être surchargépVDOORFDWHXU RSHUDWRU GHOHWH
  15. 15. lopérateur ::delete() est lallocateur 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. 16. RQVWUXFWHXUV HVWUXFWHXU $OORFDWHXU pVDOORFDWHXU ([HPSOH
  17. 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. 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. 19. +pULWDJHV 6LPSOH HW 0XOWLSOH OHV RQVWUXFWHXUV
  20. 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. 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. 22. +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/
  23. 23. ODVVHV $EVWUDLWHV SXUH YLUWXDO
  24. 24. 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/
  25. 25. RQWU{OH G$FFHV , pILQLWLRQ
  26. 26. Private (défaut) VHXOHPHQW PpWKRGHV PHPEUHV LQLWLDOLVHXUV GH OD FODVVH PpWKRGHV IULHQG Protected HQ SOXV PpWKRGHV PHPEUHV GXQH FODVVH GpULYpH Public WRXWHV PpWKRGHV RX IRQFWLRQVDidier DONSEZ 1995-1998 Un petit tour du C++ 17 http://krimo666.mylivepage.com/
  27. 27. RQWU{OH G$FFHV ,, 8WLOLVDWLRQ
  28. 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. 29. RQWU{OH G$FFHV ,,, +HULWDJH
  30. 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 = privateDD::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 daccès le contrôle daccès ne rend pas public de sa super-classe de sa super-classe le contrôle daccès à tous uniquement de sa super-classe à ses sous classes et aux friendsDidier DONSEZ 1995-1998 Un petit tour du C++ 19 http://krimo666.mylivepage.com/
  31. 31. RQWU{OH G$FFHV ,9 )ULHQG
  32. 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. 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. 34. *pQpULFLWp FODVVHV SDUDPpWUpHV 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. 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èqueDidier DONSEZ 1995-1998 Un petit tour du C++ 23 http://krimo666.mylivepage.com/
  36. 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. 37. 0DQTXHV GDQV OH 5DPDVVH 0LHWWH 0pWD 0RGqOH QDPLF %LQGLQJ 0XOWL $FWLYLWp WKUHDG -DYD RX WDVN $$
  38. 38. Didier DONSEZ 1995-1998 Un petit tour du C++ 25 http://krimo666.mylivepage.com/
  39. 39. OHV 5DPDVVHV 0LHWWH *DUEDJH ROOHFWRU
  40. 40. Destruction explicite par lopérateur de désallocation delete()6PDOOWDON -DYD Destruction implicite quand linstance nest 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 classesDidier DONSEZ 1995-1998 Un petit tour du C++ 26 http://krimo666.mylivepage.com/
  41. 41. 5DPDVVHV 0LHWWH H[HPSOH RPSWHXU GH 5pIpUHQFH
  42. 42. template class CGC class 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 effectiveDidier DONSEZ 1995-1998 Un petit tour du C++ 27 http://krimo666.mylivepage.com/
  43. 43. 0pWD ODVVHVRQVWUXFWLRQ GQDPLTXH GX VFKpPD Implantation difficile dans une approche compilé $SSOLFDWLRQV ,$ QDPLF %LQGLQJ$MRXW GHV ELEOLRWKqTXHV GREMHWV 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 $FWLYLWp3DV GH VSpFLILFDWLRQ GH RURXWLQHV RX GH 7DFKHV GDQV OH ODQJDJH %XW 2EMHWV UpDFWLIVDidier DONSEZ 1995-1998 Un petit tour du C++ 28 http://krimo666.mylivepage.com/
  44. 44. Solution: encapsuler des librairies système (pthread POSIX) si le système le permetDidier DONSEZ 1995-1998 Un petit tour du C++ 29 http://krimo666.mylivepage.com/
  45. 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ée8Q VWDQGDUG GH IDLW SRXU OH *pQLH /RJLFLHO grand nombre de compilateurs et AGL (public ou payant) choisi par lOMG (Object Management Group - i.e. CORBA) SRXU OHV 6*% 22 choisi par lODMG (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. 46. %LEOLRJUDSKLH(OOLV HW 6WURXVWUXS 7KH $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/

×