1. 8Q SHWLW WRXU GX &
'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 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/
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 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/
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 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/
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é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/
12. généré par défaut mais il peut être surchargé
$OORFDWHXU RSHUDWRU QHZ
13. l'opérateur ::new() est l'allocateur globale
il existe par défaut mais il peut être surchargé
'pVDOORFDWHXU RSHUDWRU 0ODVVGHOHWH
14. généré par défaut mais il peut être surchargé
'pVDOORFDWHXU RSHUDWRU GHOHWH
15. 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/
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 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/
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/
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/
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/
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/
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 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. ([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/
40. Destruction explicite par l'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/
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 effective
Didier DONSEZ 1995-1998 Un petit tour du C++ 27
http://krimo666.mylivepage.com/
43. 0pWD ODVVHV
RQVWUXFWLRQ GQDPLTXH GX 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 des librairies 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 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/