Académique Documents
Professionnel Documents
Culture Documents
2. Constructeur et Destructeur
4. Données statiques
5. Généricité
Rappels
3
En C++ :
Associer à une structure, en plus des données, des fonctions
nommées « fonctions membres » ou « méthodes ».
Déclaration et définition d’une classe…
5
class Point
{ int x; Déclaration de la classe point
int y;
public : Instanciation de la classe point
void Init(int a, int b); en un objet p
void Deplace(int a, int b);
void Affiche(); void main()
}; {
Point p;
p.Init(3,4);
void Point::Init(int a, int b) p.Affiche();
{ x = a; y = b; } p.Deplace(4,6);
p.Affiche();
void Point::Deplace(int a, int b) }
{ x += a; y += b; }
void Point::Affiche()
{ cout << x << ", " << y << endl; } On applique la méthode Affiche()
à l'objet p
Protection/visibilité
8
Protection/visibilité
9
Private : illégal
void deplace (int, int) ;
};
Affectation d’objets
10
class A {
Méthode inline
public :
int f() const;
inline void g(int val);
private :
int i;
};
= free a;
Le constructeur et le destructeur
20
Constructeur
Une fonction membre portant le même nom que sa classe se nomme
constructeur,
Un constructeur peut avoir des arguments mais ne renvoie pas de
valeur (aucune indication de type même pas void ),
Le constructeur est appelé implicitement tout juste après l’allocation
de l’espace mémoire destiné à l’objet.
Destructeur
Une fonction membre portant le même nom que sa classe, précédé
du symbole (~), se nomme destructeur,
Un destructeur ne peut pas comporter d’arguments et il ne renvoie
pas de valeur ( aucune indication de type ne doit être prévue ),
Le destructeur est appelé implicitement avant la libération de
l’espace mémoire associé à l’objet.
Le constructeur et le destructeur
21
class A {
public : Un Constructeur de A
A();
Un Constructeur surdéfini de A
A(int);
... Le destructeur
~A();
... Objet automatique
}; void main()
{ Le constructeur de A est exécuté
A a; automatiquement
par A().
A * ptr; Le destructeur est appelé à la sortie de la
printf("%d \n",a.f()); fonction
... ou du bloc de déclaration.
ptr = new A(1);
...
delete ptr;
}
Le destructeur est exécuté
Le constructeur et le destructeur
22
class A {
public : Un Constructeur de A
A();
Un Constructeur surdéfini de A
A(int);
... Le destructeur
~A();
... Objet dynamique
}; void main()
{
Le constructeur A(int) est appelé
A a;
A * ptr; Réalise une allocation dynamique d'espace
printf("%d \n",a.f()); mémoire pour un élément de type A
... et affecte son adresse au pointeur ptr.
ptr = new A(1);
...
delete ptr;
}
Le destructeur est exécuté
Constructeur (…)
23
• Les attributs non initialisés dans cette section prendront une valeur par
défaut dans le cas où une telle valeur existe.
b
Constructeur de copie
29
class Bidon
{
void fct (Bidon )
double * adr ; // pointeur sur 1 élément { cout << "*** appel de fct ***\n"
;
public :
}
Bidon() // constructeur "usuel"
{…}
Bidon(const Bidon & v) // constructeur de recopie main()
{ {
adr = new double ; // création nouvel objet Bidon a ;
fct (a) ;
*adr = *(v.adr); // recopie des contenus des ptr }
cout << "+ const. recopie - adr objet : " << this
<< " - adr : " << adr << "\n" ;
}
~Bidon() // destructeur
{ ….}
};
Constructeur de copie
30
b
Surcharge des opérateurs
31
class point
{ int x, y ;
public :
Void main()
point (int abs=0, int ord=0) { x=abs ; y=ord ;} {
point operator + (const point &) ; point a(1,2) ; a.affiche() ;
Int operator == (const point &) ; point b(2,5) ; b.affiche() ;
void affiche () { cout << "coordonnees : " << x << " " point c ;
<< y << "\n" ; } c = a+b ; c.affiche() ;
};
}
point point::operator + (const point & a)
coordonnees : 1 2
{ point p ;
coordonnees : 2 5
p.x = x + a.x ; p.y = y + a.y ; coordonnees : 3 7
return p ;
}
int point::operator==(const point & p)
{ if( x==p.x && y==p.y )
return 1;
else
return 0;
}
Surcharge des opérateurs
32
class vect
main()
{ int nelem ; // nombre d'éléments { vect a(5) , b(3);
double * adr ; // pointeur sur ces éléments
public : b=a;
}
vect (int n) // constructeur "usuel"
{ adr = new double [nelem = n] ;
cout << "+ const. usuel - adr objet : " << this << " -
adr vecteur : " << adr << "\n" ;
}
~vect () // destructeur
{ cout << "- Destr. objet - adr objet : "
<< this << " - adr vecteur : " << adr << "\n" ;
delete adr ;}
};
Surdéfinition de l’opérateur =
36
class exple2
{ static int n ;
float x ;
...
};
la déclaration :
exple2 a, b ;
class A classe A;
{ class B
// partie privée {…
…. friend void f(A, B) ;
//partie publique };
friend void f(A, B) ;
void f(A..., B...)
..... { // on a accès ici aux membres privés
}; // de n’importe quel objet de type A ou B
}
formatage
printf("%d %s %lu \n", 10, " Salut ", 15567L);
cout << 10 << " Salut " << 15567L << endl;
cadrage
1
printf(" %5d", 1);
précision
3 . 1 4 1
printf(" %.3f", 3.1415927);
standard
int age;
char name[20];
cin >> age >> name;
Fichiers et Tampon
47
Tampon (buffer):
entrée / sortie istrstream, ostrstream
#include <strstream>
char * p = new char[20];
ostrstream ch(p, 20);
ch << "age=" << 14;
Cout …
48
class Horloge
{
public:
…
};
void main()
{
Horloge h(23,59,57);
cout << h << endl;
}