97
Programmation Orientée Objet en C++ Emanuel Aldea <[email protected]> http://hebergement.u-psud.fr/emi M1-E3A

Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Embed Size (px)

Citation preview

Page 1: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Programmation Orientée Objet en C++

Emanuel Aldea <[email protected]>http://hebergement.u-psud.fr/emi

M1-E3A

Page 2: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Deuxième chapitre

Les objets

Page 3: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

L’approche objet

La notion de classe• un type de données parmi d’autres

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (3/24)

Page 4: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

L’approche objet

La notion de classe• un type de données parmi d’autres

• mais definition de nouveaux types utilisables comme les types prédéfinis !

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (3/24)

Page 5: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

L’approche objet

La notion de classe• un type de données parmi d’autres

• mais definition de nouveaux types utilisables comme les types prédéfinis !

• une instance d’une classe est appelée objet

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (3/24)

Page 6: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

L’approche objet

La notion de classe• un type de données parmi d’autres

• mais definition de nouveaux types utilisables comme les types prédéfinis !

• une instance d’une classe est appelée objet

• déclaration : syntaxe modifiée d’une structure

• droits : public, protected, private

• méthodes : les fonctions de l’objet

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (3/24)

Page 7: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

L’approche objet

La notion de classe• un type de données parmi d’autres

• mais definition de nouveaux types utilisables comme les types prédéfinis !

• une instance d’une classe est appelée objet

• déclaration : syntaxe modifiée d’une structure

• droits : public, protected, private

• méthodes : les fonctions de l’objet

• méthodes spéciales :

• constructeurs : appelés à la création, sans type de retour, entre zéro etplusieurs paramètres : type_classe (...)

• destructeur : unique, appelé à la destruction, sans paramètres, sansretour : ~type_classe ()

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (3/24)

Page 8: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Quelle est la vie d’un objet ?

Création• allocation de mémoire : sizeof (type_classe) octets

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (4/24)

Page 9: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Quelle est la vie d’un objet ?

Création• allocation de mémoire : sizeof (type_classe) octets

• appel d’un des constructeurs

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (4/24)

Page 10: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Quelle est la vie d’un objet ?

Création• allocation de mémoire : sizeof (type_classe) octets

• appel d’un des constructeurs

Utilisation

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (4/24)

Page 11: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Quelle est la vie d’un objet ?

Création• allocation de mémoire : sizeof (type_classe) octets

• appel d’un des constructeurs

Utilisation• lecture/écriture des attributs accessibles

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (4/24)

Page 12: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Quelle est la vie d’un objet ?

Création• allocation de mémoire : sizeof (type_classe) octets

• appel d’un des constructeurs

Utilisation• lecture/écriture des attributs accessibles

• appel des méthodes accessibles

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (4/24)

Page 13: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Quelle est la vie d’un objet ?

Création• allocation de mémoire : sizeof (type_classe) octets

• appel d’un des constructeurs

Utilisation• lecture/écriture des attributs accessibles

• appel des méthodes accessibles

Destruction

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (4/24)

Page 14: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Quelle est la vie d’un objet ?

Création• allocation de mémoire : sizeof (type_classe) octets

• appel d’un des constructeurs

Utilisation• lecture/écriture des attributs accessibles

• appel des méthodes accessibles

Destruction• appel de l’unique destructeur

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (4/24)

Page 15: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Quelle est la vie d’un objet ?

Création• allocation de mémoire : sizeof (type_classe) octets

• appel d’un des constructeurs

Utilisation• lecture/écriture des attributs accessibles

• appel des méthodes accessibles

Destruction• appel de l’unique destructeur

• libération de la mémoire : sizeof (type_classe) octets

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (4/24)

Page 16: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

L’approche objet

• en C++ toute donnée est un objet et inversement

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (5/24)

Page 17: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

L’approche objet

• en C++ toute donnée est un objet et inversement

• au début de la vie : construction ⇒ appel d’un constructeur (même un quine fait rien)

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (5/24)

Page 18: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

L’approche objet

• en C++ toute donnée est un objet et inversement

• au début de la vie : construction ⇒ appel d’un constructeur (même un quine fait rien)

• tout objet possède deux constructeurs par défaut :

• un constructeur sans paramètres

• un constructeur de copie

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (5/24)

Page 19: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

L’approche objet

• en C++ toute donnée est un objet et inversement

• au début de la vie : construction ⇒ appel d’un constructeur (même un quine fait rien)

• tout objet possède deux constructeurs par défaut :

• un constructeur sans paramètres

• un constructeur de copie

• a la fin de la vie : destruction ⇒ appel du destructeur (même un qui ne faitrien)

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (5/24)

Page 20: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

L’approche objet

• en C++ toute donnée est un objet et inversement

• au début de la vie : construction ⇒ appel d’un constructeur (même un quine fait rien)

• tout objet possède deux constructeurs par défaut :

• un constructeur sans paramètres

• un constructeur de copie

• a la fin de la vie : destruction ⇒ appel du destructeur (même un qui ne faitrien)

• tous les objets (y compris les objets natifs) possèdent un destructeur pardéfaut qui ne fait rien

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (5/24)

Page 21: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Les constructeurs

• remplace une méthode de type init(...)

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (6/24)

Page 22: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Les constructeurs

• remplace une méthode de type init(...)

• les constructeurs avec zéro ou plusieurs paramètres : CObj(...)

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (6/24)

Page 23: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Les constructeurs

• remplace une méthode de type init(...)

• les constructeurs avec zéro ou plusieurs paramètres : CObj(...)

• le constructeur de copie : CObj(const CObj& obj)

• on crée une instance qui est une copie d’un autre objet

• appelé lorsqu’un objet est envoyé par valeur à une fonction ; la fonctioncrée une copie temporaire

• appelé aussi lorsqu’une fonction retourne un objet

• par défaut, il appelle récursivement les constructeurs de copie desmembres de la classe

• nécessaire lorsque la classe contient des ressources dynamiques !

• pas d’erreur si le compilateur ne le trouve pas ! (pour quoi ?)

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (6/24)

Page 24: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : le type natif int

void main(){

int i; // appel de int ()int j(12); // int j=12, appel de int ( const int & val)int k(j); // int k=j, appel de int ( const int & val)int m=k+j; // int m(k+j), appel de int ( const int & val)int* pi1=new int (k*j); // appel de int ( const int & val)delete pi1; // appel de ~ int ()

}// quatre appels de ~ int ()

• le constructeur int() ne fait rien

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (7/24)

Page 25: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : le type natif int

void main(){

int i; // appel de int ()int j(12); // int j=12, appel de int ( const int & val)int k(j); // int k=j, appel de int ( const int & val)int m=k+j; // int m(k+j), appel de int ( const int & val)int* pi1=new int (k*j); // appel de int ( const int & val)delete pi1; // appel de ~ int ()

}// quatre appels de ~ int ()

• le constructeur int() ne fait rien

• le constructeur int(const int & val) copie val dans l’objet

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (7/24)

Page 26: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : le type natif int

void main(){

int i; // appel de int ()int j(12); // int j=12, appel de int ( const int & val)int k(j); // int k=j, appel de int ( const int & val)int m=k+j; // int m(k+j), appel de int ( const int & val)int* pi1=new int (k*j); // appel de int ( const int & val)delete pi1; // appel de ~ int ()

}// quatre appels de ~ int ()

• le constructeur int() ne fait rien

• le constructeur int(const int & val) copie val dans l’objet

• le destructeur int() ne fait rien

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (7/24)

Page 27: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Les méthodes (fonctions membres)

Une méthode est une fonction qui travaille pour l’objet (l’instance) pour lequel onl’appelle

• son code a un accès direct (par nom) à tous les attributs de l’objet et lesméthodes de la classe

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (8/24)

Page 28: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Les méthodes (fonctions membres)

Une méthode est une fonction qui travaille pour l’objet (l’instance) pour lequel onl’appelle

• son code a un accès direct (par nom) à tous les attributs de l’objet et lesméthodes de la classe

• elle a toujours un premier paramètre caché appelé this qui représente l’adressede l’objet pour lequel on l’appelle - donc si l’on appelle de l’extérieur il fautpréciser l’objet

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (8/24)

Page 29: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Les méthodes (fonctions membres)

Une méthode est une fonction qui travaille pour l’objet (l’instance) pour lequel onl’appelle

• son code a un accès direct (par nom) à tous les attributs de l’objet et lesméthodes de la classe

• elle a toujours un premier paramètre caché appelé this qui représente l’adressede l’objet pour lequel on l’appelle - donc si l’on appelle de l’extérieur il fautpréciser l’objet

• appel de l’intérieur d’une autre méthode (accès direct) :NomMethode (parametres)

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (8/24)

Page 30: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Les méthodes (fonctions membres)

Une méthode est une fonction qui travaille pour l’objet (l’instance) pour lequel onl’appelle

• son code a un accès direct (par nom) à tous les attributs de l’objet et lesméthodes de la classe

• elle a toujours un premier paramètre caché appelé this qui représente l’adressede l’objet pour lequel on l’appelle - donc si l’on appelle de l’extérieur il fautpréciser l’objet

• appel de l’intérieur d’une autre méthode (accès direct) :NomMethode (parametres)

• appel de l’extérieur de la classe (accès indirect) :objet.NomMethode (parametres) // ouptrobjet ->NomMethode (parametres) // idem a : (* ptrobjet ).

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (8/24)

Page 31: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Définitions des méthodes

Définition inline• déclaration suivie de définition à l’intérieur de la déclaration de classe

Définition outline

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (9/24)

Page 32: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Définitions des méthodes

Définition inline• déclaration suivie de définition à l’intérieur de la déclaration de classe

• typiquement dans un fichier header

class CCercle{float rayon;//...public:

void SetRay ( float _rayon) {rayon=_rayon ;}};

Définition outline

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (9/24)

Page 33: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Définitions des méthodes

Définition inline• déclaration suivie de définition à l’intérieur de la déclaration de classe

• typiquement dans un fichier header

class CCercle{float rayon;//...public:

void SetRay ( float _rayon) {rayon=_rayon ;}};

Définition outline• déclaration à l’intérieur (fichier header), et définition à l’extérieur de la déclaration de classe (fisier .cpp)

class CCercle{ // declarationfloat rayon;//...public:void SetRay ( float _rayon );

};

fichier header

// definition

void CCercle :: SetRay (float _rayon){

rayon=_rayon;}

fichier source

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (9/24)

Page 34: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Modéliser une fraction entière :class CFract{

// private par defautpublic:

int a, b;void Afficher (){

printf ("Fraction : (%d/%d) \ n",a,b);}

};

CFract a déjà deux constructeurs par défaut et un destructeur par défaut. Sans rien demander, le compilateur génèrele code suivant (pas inclus dans les sources) :

// constructeur sans parametresCFract () {}

// constructeur de copieCFract ( const CFract & f) { a=f.a; b=f.b }

// destructeur par defaut~CFract () {}

// surcharge de l'operateur =CFract & operator = ( const CFract & f){ a=f.a; b=f.b; return * this ; }

Toute déclaration explicite d’un constructeur (sauf celui de copie) désactive la génération automatique du

constructeur par défaut sans paramètres.

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (10/24)

Page 35: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Avec les constructeurs / destructeur par défaut :

• Déclarez la classe puis des variables locales f1 et f2 de typeCFract .

• Faire afficher f1 et f2 .

• Modifiez le programme, rajoutez une variable f3 et utilisez leconstructeur de copie pour faire que f3 ait le même contenu quef1 .

• Même exercice avec une instance dynamique de la classe CFractpointée par pf4 . Faire que cette variable ait le contenu de f2.

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (11/24)

Page 36: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Comment initialiser les attributs ?

• De l’extérieur : il faut qu’ils soient accessibles, et c’est contraire à l’approche objet

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (12/24)

Page 37: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Comment initialiser les attributs ?

• De l’extérieur : il faut qu’ils soient accessibles, et c’est contraire à l’approche objet

• De l’intérieur : par une méthode publique Init ou par le constructeur de classe :

class CFract{

int a, b;// ...public:

CFract ( int _a, int _b): a(_a), b(_b) {}};

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (12/24)

Page 38: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Comment initialiser les attributs ?

• De l’extérieur : il faut qu’ils soient accessibles, et c’est contraire à l’approche objet

• De l’intérieur : par une méthode publique Init ou par le constructeur de classe :

class CFract{

int a, b;// ...public:

CFract ( int _a, int _b): a(_a), b(_b) {}};

• Modifier le programme en rajoutant le constructeur explicite. Est-ce que les deux constructeurs par défautrestent encore valables ?

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (12/24)

Page 39: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Comment initialiser les attributs ?

• De l’extérieur : il faut qu’ils soient accessibles, et c’est contraire à l’approche objet

• De l’intérieur : par une méthode publique Init ou par le constructeur de classe :

class CFract{

int a, b;// ...public:

CFract ( int _a, int _b): a(_a), b(_b) {}};

• Modifier le programme en rajoutant le constructeur explicite. Est-ce que les deux constructeurs par défautrestent encore valables ?

• Modifier le programme de test ...

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (12/24)

Page 40: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Comment initialiser les attributs ?

• De l’extérieur : il faut qu’ils soient accessibles, et c’est contraire à l’approche objet

• De l’intérieur : par une méthode publique Init ou par le constructeur de classe :

class CFract{

int a, b;// ...public:

CFract ( int _a, int _b): a(_a), b(_b) {}};

• Modifier le programme en rajoutant le constructeur explicite. Est-ce que les deux constructeurs par défautrestent encore valables ?

• Modifier le programme de test ...

• Rajouter un constructeur copie et un destructeur et affichez des messages d’informations dans chacun.

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (12/24)

Page 41: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Comment initialiser les attributs ?

• De l’extérieur : il faut qu’ils soient accessibles, et c’est contraire à l’approche objet

• De l’intérieur : par une méthode publique Init ou par le constructeur de classe :

class CFract{

int a, b;// ...public:

CFract ( int _a, int _b): a(_a), b(_b) {}};

• Modifier le programme en rajoutant le constructeur explicite. Est-ce que les deux constructeurs par défautrestent encore valables ?

• Modifier le programme de test ...

• Rajouter un constructeur copie et un destructeur et affichez des messages d’informations dans chacun.

• Déclarez des tableaux locaux de 6 CFract et dynamiques de 4 CFract .

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (12/24)

Page 42: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Comment initialiser les attributs ?

• De l’extérieur : il faut qu’ils soient accessibles, et c’est contraire à l’approche objet

• De l’intérieur : par une méthode publique Init ou par le constructeur de classe :

class CFract{

int a, b;// ...public:

CFract ( int _a, int _b): a(_a), b(_b) {}};

• Modifier le programme en rajoutant le constructeur explicite. Est-ce que les deux constructeurs par défautrestent encore valables ?

• Modifier le programme de test ...

• Rajouter un constructeur copie et un destructeur et affichez des messages d’informations dans chacun.

• Déclarez des tableaux locaux de 6 CFract et dynamiques de 4 CFract .

• Quelle est l’erreur ? Comment retrouver un constructeur sans paramètres ?

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (12/24)

Page 43: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Comment initialiser les attributs ?

• De l’extérieur : il faut qu’ils soient accessibles, et c’est contraire à l’approche objet

• De l’intérieur : par une méthode publique Init ou par le constructeur de classe :

class CFract{

int a, b;// ...public:

CFract ( int _a, int _b): a(_a), b(_b) {}};

• Modifier le programme en rajoutant le constructeur explicite. Est-ce que les deux constructeurs par défautrestent encore valables ?

• Modifier le programme de test ...

• Rajouter un constructeur copie et un destructeur et affichez des messages d’informations dans chacun.

• Déclarez des tableaux locaux de 6 CFract et dynamiques de 4 CFract .

• Quelle est l’erreur ? Comment retrouver un constructeur sans paramètres ?

• Surveiller la vie de tous les objets CFract (comment ?) .

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (12/24)

Page 44: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Comment initialiser les attributs ?

• De l’extérieur : il faut qu’ils soient accessibles, et c’est contraire à l’approche objet

• De l’intérieur : par une méthode publique Init ou par le constructeur de classe :

class CFract{

int a, b;// ...public:

CFract ( int _a, int _b): a(_a), b(_b) {}};

• Modifier le programme en rajoutant le constructeur explicite. Est-ce que les deux constructeurs par défautrestent encore valables ?

• Modifier le programme de test ...

• Rajouter un constructeur copie et un destructeur et affichez des messages d’informations dans chacun.

• Déclarez des tableaux locaux de 6 CFract et dynamiques de 4 CFract .

• Quelle est l’erreur ? Comment retrouver un constructeur sans paramètres ?

• Surveiller la vie de tous les objets CFract (comment ?) .

• Rajouter une méthode MultTo pour multiplier une fraction par une autre.

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (12/24)

Page 45: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Comment initialiser les attributs ?

• De l’extérieur : il faut qu’ils soient accessibles, et c’est contraire à l’approche objet

• De l’intérieur : par une méthode publique Init ou par le constructeur de classe :

class CFract{

int a, b;// ...public:

CFract ( int _a, int _b): a(_a), b(_b) {}};

• Modifier le programme en rajoutant le constructeur explicite. Est-ce que les deux constructeurs par défautrestent encore valables ?

• Modifier le programme de test ...

• Rajouter un constructeur copie et un destructeur et affichez des messages d’informations dans chacun.

• Déclarez des tableaux locaux de 6 CFract et dynamiques de 4 CFract .

• Quelle est l’erreur ? Comment retrouver un constructeur sans paramètres ?

• Surveiller la vie de tous les objets CFract (comment ?) .

• Rajouter une méthode MultTo pour multiplier une fraction par une autre.

• Rajouter une méthode AddTo pour additionner une fraction à une autre.

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (12/24)

Page 46: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Comment initialiser les attributs ?

• De l’extérieur : il faut qu’ils soient accessibles, et c’est contraire à l’approche objet

• De l’intérieur : par une méthode publique Init ou par le constructeur de classe :

class CFract{

int a, b;// ...public:

CFract ( int _a, int _b): a(_a), b(_b) {}};

• Modifier le programme en rajoutant le constructeur explicite. Est-ce que les deux constructeurs par défautrestent encore valables ?

• Modifier le programme de test ...

• Rajouter un constructeur copie et un destructeur et affichez des messages d’informations dans chacun.

• Déclarez des tableaux locaux de 6 CFract et dynamiques de 4 CFract .

• Quelle est l’erreur ? Comment retrouver un constructeur sans paramètres ?

• Surveiller la vie de tous les objets CFract (comment ?) .

• Rajouter une méthode MultTo pour multiplier une fraction par une autre.

• Rajouter une méthode AddTo pour additionner une fraction à une autre.

• Rajouter une méthode Norm qui normalise la valeur de la fraction. Utilisez-la dans les endroits nécessaires.

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (12/24)

Page 47: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Comment initialiser les attributs ?

• De l’extérieur : il faut qu’ils soient accessibles, et c’est contraire à l’approche objet

• De l’intérieur : par une méthode publique Init ou par le constructeur de classe :

class CFract{

int a, b;// ...public:

CFract ( int _a, int _b): a(_a), b(_b) {}};

• Modifier le programme en rajoutant le constructeur explicite. Est-ce que les deux constructeurs par défautrestent encore valables ?

• Modifier le programme de test ...

• Rajouter un constructeur copie et un destructeur et affichez des messages d’informations dans chacun.

• Déclarez des tableaux locaux de 6 CFract et dynamiques de 4 CFract .

• Quelle est l’erreur ? Comment retrouver un constructeur sans paramètres ?

• Surveiller la vie de tous les objets CFract (comment ?) .

• Rajouter une méthode MultTo pour multiplier une fraction par une autre.

• Rajouter une méthode AddTo pour additionner une fraction à une autre.

• Rajouter une méthode Norm qui normalise la valeur de la fraction. Utilisez-la dans les endroits nécessaires.

• Rendre explicites les différentes protections à la modification en utilisant const

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (12/24)

Page 48: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Exemple : CFract

Comment initialiser les attributs ?

• De l’extérieur : il faut qu’ils soient accessibles, et c’est contraire à l’approche objet

• De l’intérieur : par une méthode publique Init ou par le constructeur de classe :

class CFract{

int a, b;// ...public:

CFract ( int _a, int _b): a(_a), b(_b) {}};

• Modifier le programme en rajoutant le constructeur explicite. Est-ce que les deux constructeurs par défautrestent encore valables ?

• Modifier le programme de test ...

• Rajouter un constructeur copie et un destructeur et affichez des messages d’informations dans chacun.

• Déclarez des tableaux locaux de 6 CFract et dynamiques de 4 CFract .

• Quelle est l’erreur ? Comment retrouver un constructeur sans paramètres ?

• Surveiller la vie de tous les objets CFract (comment ?) .

• Rajouter une méthode MultTo pour multiplier une fraction par une autre.

• Rajouter une méthode AddTo pour additionner une fraction à une autre.

• Rajouter une méthode Norm qui normalise la valeur de la fraction. Utilisez-la dans les endroits nécessaires.

• Rendre explicites les différentes protections à la modification en utilisant const

• Réfléchir sur l’accessibilité à donner aux méthodes de CFract.

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (12/24)

Page 49: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation

• Notion essentielle dans la programmation objet

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (13/24)

Page 50: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation

• Notion essentielle dans la programmation objet

• Suppose une séparation entre l’interface publique (accessible) d’une classe et son fonctionnement interne qui nedoit pas être ni perturbé ni forcement connu par l’extérieur.

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (13/24)

Page 51: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation

• Notion essentielle dans la programmation objet

• Suppose une séparation entre l’interface publique (accessible) d’une classe et son fonctionnement interne qui nedoit pas être ni perturbé ni forcement connu par l’extérieur.

• Outils pour la mise en ouvre de l’encapsulation

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (13/24)

Page 52: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation

• Notion essentielle dans la programmation objet

• Suppose une séparation entre l’interface publique (accessible) d’une classe et son fonctionnement interne qui nedoit pas être ni perturbé ni forcement connu par l’extérieur.

• Outils pour la mise en ouvre de l’encapsulation

• d’une architecture pensée et validée par le concepteur

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (13/24)

Page 53: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation

• Notion essentielle dans la programmation objet

• Suppose une séparation entre l’interface publique (accessible) d’une classe et son fonctionnement interne qui nedoit pas être ni perturbé ni forcement connu par l’extérieur.

• Outils pour la mise en ouvre de l’encapsulation

• d’une architecture pensée et validée par le concepteur

• des droits et d’espaces d’accès

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (13/24)

Page 54: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation

• Notion essentielle dans la programmation objet

• Suppose une séparation entre l’interface publique (accessible) d’une classe et son fonctionnement interne qui nedoit pas être ni perturbé ni forcement connu par l’extérieur.

• Outils pour la mise en ouvre de l’encapsulation

• d’une architecture pensée et validée par le concepteur

• des droits et d’espaces d’accès

• renforcement / relâchement des contraintes

Accès class struct union

public possible par défaut par défautprotected possible possible impossibleprivate par défaut possible impossible

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (13/24)

Page 55: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation

• Notion essentielle dans la programmation objet

• Suppose une séparation entre l’interface publique (accessible) d’une classe et son fonctionnement interne qui nedoit pas être ni perturbé ni forcement connu par l’extérieur.

• Outils pour la mise en ouvre de l’encapsulation

• d’une architecture pensée et validée par le concepteur

• des droits et d’espaces d’accès

• renforcement / relâchement des contraintes

Accès class struct union

public possible par défaut par défautprotected possible possible impossibleprivate par défaut possible impossible

Droits d’accès :

Accès classe elle-même classe dérivée exterieur

public OUI OUI OUIprotected OUI OUI NONprivate OUI NON NON

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (13/24)

Page 56: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Droits d’accès : protection par const

• Méthode/fonction, paramètre précédé par const :

• seulement pour les références et les pointeurs

• signifie que l’objet pointé (référencé) ne sera pas modifié parle code de la méthode

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (14/24)

Page 57: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Droits d’accès : protection par const

• Méthode/fonction, paramètre précédé par const :

• seulement pour les références et les pointeurs

• signifie que l’objet pointé (référencé) ne sera pas modifié parle code de la méthode

• Méthode suivie de const :

• l’objet *this est protégé par rapport à la méthode

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (14/24)

Page 58: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Droits d’accès : protection par const

• Méthode/fonction, paramètre précédé par const :

• seulement pour les références et les pointeurs

• signifie que l’objet pointé (référencé) ne sera pas modifié parle code de la méthode

• Méthode suivie de const :

• l’objet *this est protégé par rapport à la méthode

• Variable (objet) protégée par const :

• on ne peut plus le modifier mais on peut lire ses attributs etappeler ses méthodes constantes

• une variable entière constante peut servir comme taille detableau non-dynamique, valeur de case etc.

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (14/24)

Page 59: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Droits d’accès : protection par const

• Méthode/fonction, paramètre précédé par const :

• seulement pour les références et les pointeurs

• signifie que l’objet pointé (référencé) ne sera pas modifié parle code de la méthode

• Méthode suivie de const :

• l’objet *this est protégé par rapport à la méthode

• Variable (objet) protégée par const :

• on ne peut plus le modifier mais on peut lire ses attributs etappeler ses méthodes constantes

• une variable entière constante peut servir comme taille detableau non-dynamique, valeur de case etc.

• Déclaration de constantes spécifiques pour une classe :

• eviter #define (accessible partout, conflit de noms, #undef)• utiliser des variables de type static const

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (14/24)

Page 60: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation : architecture

• Comment protéger l’accès à un attribut :

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (15/24)

Page 61: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation : architecture

• Comment protéger l’accès à un attribut :

• complètement : par droit d’accès private

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (15/24)

Page 62: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation : architecture

• Comment protéger l’accès à un attribut :

• complètement : par droit d’accès private• sauf pour les héritiers : par droit d’accès protected

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (15/24)

Page 63: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation : architecture

• Comment protéger l’accès à un attribut :

• complètement : par droit d’accès private• sauf pour les héritiers : par droit d’accès protected• interdiction d’écriture : private et méthode publique

type_attr GetAttribute()

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (15/24)

Page 64: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation : architecture

• Comment protéger l’accès à un attribut :

• complètement : par droit d’accès private• sauf pour les héritiers : par droit d’accès protected• interdiction d’écriture : private et méthode publique

type_attr GetAttribute()

• filtrage d’écriture : private et méthode publique boolSetAttribute(type_attr)

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (15/24)

Page 65: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation : architecture

• Comment protéger l’accès à un attribut :

• complètement : par droit d’accès private• sauf pour les héritiers : par droit d’accès protected• interdiction d’écriture : private et méthode publique

type_attr GetAttribute()

• filtrage d’écriture : private et méthode publique boolSetAttribute(type_attr)

• les méthodes de type GetXXX et SetXXX sont appelées desaccesseurs (setters et getters)

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (15/24)

Page 66: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation : architecture

• Comment protéger l’accès à un attribut :

• complètement : par droit d’accès private• sauf pour les héritiers : par droit d’accès protected• interdiction d’écriture : private et méthode publique

type_attr GetAttribute()

• filtrage d’écriture : private et méthode publique boolSetAttribute(type_attr)

• les méthodes de type GetXXX et SetXXX sont appelées desaccesseurs (setters et getters)

• pour des raisons d’efficacité, on les déclare inline

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (15/24)

Page 67: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation : exemple

• Comment s’assurer que le dénominateur de la fraction CFract nesera jamais nul ? Et que les deux attributs ne seront jamaisnégatifs en même temps ?

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (16/24)

Page 68: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation : exemple

• Comment s’assurer que le dénominateur de la fraction CFract nesera jamais nul ? Et que les deux attributs ne seront jamaisnégatifs en même temps ?

• Réorganiser la classe CFract pour attendre ces objectifs, sansrestreindre l’accès en lecture aux deux attributs de la fraction.

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (16/24)

Page 69: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Encapsulation : exemple

• Comment s’assurer que le dénominateur de la fraction CFract nesera jamais nul ? Et que les deux attributs ne seront jamaisnégatifs en même temps ?

• Réorganiser la classe CFract pour attendre ces objectifs, sansrestreindre l’accès en lecture aux deux attributs de la fraction.

• Et si l’on rajoute la contrainte suivante : “l’utilisateur ne peutjamais modifier directement les deux attributs (seulement lesinitialiser à la construction)” ?

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (16/24)

Page 70: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Surcharge des opérateurs

A quoi cela sert ?

• écrire a+b à la place de Add(a,b) ou a.Add(b)

Comment ?

Quels opérateurs ?

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (17/24)

Page 71: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Surcharge des opérateurs

A quoi cela sert ?

• écrire a+b à la place de Add(a,b) ou a.Add(b)

Comment ?

• par méthode

Quels opérateurs ?

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (17/24)

Page 72: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Surcharge des opérateurs

A quoi cela sert ?

• écrire a+b à la place de Add(a,b) ou a.Add(b)

Comment ?

• par méthode

• par fonction

Quels opérateurs ?

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (17/24)

Page 73: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Surcharge des opérateurs

A quoi cela sert ?

• écrire a+b à la place de Add(a,b) ou a.Add(b)

Comment ?

• par méthode

• par fonction

Quels opérateurs ?

• par méthode/fonction : + - / * | || & && « » < > ++ –

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (17/24)

Page 74: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Surcharge des opérateurs

A quoi cela sert ?

• écrire a+b à la place de Add(a,b) ou a.Add(b)

Comment ?

• par méthode

• par fonction

Quels opérateurs ?

• par méthode/fonction : + - / * | || & && « » < > ++ –• uniquement par méthode : = -> [] ()

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (17/24)

Page 75: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Surcharge des opérateurs

A quoi cela sert ?

• écrire a+b à la place de Add(a,b) ou a.Add(b)

Comment ?

• par méthode

• par fonction

Quels opérateurs ?

• par méthode/fonction : + - / * | || & && « » < > ++ –• uniquement par méthode : = -> [] ()• pas de surcharge : . .* : : : :* ? : sizeof

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (17/24)

Page 76: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Surcharge - exemple par fonction

class complexe{

float r, i;public:

complexe(float _r, float _i): r(_r), i(_i) {}friend const complexe operator+ (const complexe& c1 ,

const complexe& c2);};

const complexe operator+ (const complexe& c1,const complexe& c2)

{return complexe(c1.r+c2.r, c1.i+c2.i);

}

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (18/24)

Page 77: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Surcharge - exemple par méthode

class complexe{

float r, i;public:

complexe(float _r, float _i): r(_r), i(_i) {}const complexe operator+ (const complexe& c2) const{

return complexe(r+c2.r, i+c2.i);}

};

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (19/24)

Page 78: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Opérateurs pour CFract

Doter la classe CFract :

• d’un opérateur d’addition suivie d’attribution += et demultiplication suivie d’attribution *=

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (20/24)

Page 79: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Opérateurs pour CFract

Doter la classe CFract :

• d’un opérateur d’addition suivie d’attribution += et demultiplication suivie d’attribution *=

• d’un opérateur d’addition + et de multiplication *

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (20/24)

Page 80: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Opérateurs pour CFract

Doter la classe CFract :

• d’un opérateur d’addition suivie d’attribution += et demultiplication suivie d’attribution *=

• d’un opérateur d’addition + et de multiplication *• de post- et pre-incrementation (++), de comparaison (==)

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (20/24)

Page 81: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Opérateurs pour CFract

Doter la classe CFract :

• d’un opérateur d’addition suivie d’attribution += et demultiplication suivie d’attribution *=

• d’un opérateur d’addition + et de multiplication *• de post- et pre-incrementation (++), de comparaison (==)

• d’un opérateur de conversion emphtypecast vers un double

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (20/24)

Page 82: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Opérateurs pour CFract

Doter la classe CFract :

• d’un opérateur d’addition suivie d’attribution += et demultiplication suivie d’attribution *=

• d’un opérateur d’addition + et de multiplication *• de post- et pre-incrementation (++), de comparaison (==)

• d’un opérateur de conversion emphtypecast vers un double

• tester les opérateurs ainsi surchargés

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (20/24)

Page 83: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Opérateurs pour CFract

Doter la classe CFract :

• d’un opérateur d’addition suivie d’attribution += et demultiplication suivie d’attribution *=

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (21/24)

Page 84: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Opérateurs pour CFract

Doter la classe CFract :

• d’un opérateur d’addition suivie d’attribution += et demultiplication suivie d’attribution *=

• d’un opérateur d’addition + et de multiplication *

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (21/24)

Page 85: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Opérateurs pour CFract

Doter la classe CFract :

• d’un opérateur d’addition suivie d’attribution += et demultiplication suivie d’attribution *=

• d’un opérateur d’addition + et de multiplication *• de post- et pre-incrementation (++), de comparaison (==)

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (21/24)

Page 86: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Opérateurs pour CFract

Doter la classe CFract :

• d’un opérateur d’addition suivie d’attribution += et demultiplication suivie d’attribution *=

• d’un opérateur d’addition + et de multiplication *• de post- et pre-incrementation (++), de comparaison (==)

• d’un opérateur de conversion emphtypecast vers un double

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (21/24)

Page 87: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Opérateurs pour CFract

Doter la classe CFract :

• d’un opérateur d’addition suivie d’attribution += et demultiplication suivie d’attribution *=

• d’un opérateur d’addition + et de multiplication *• de post- et pre-incrementation (++), de comparaison (==)

• d’un opérateur de conversion emphtypecast vers un double

• tester les opérateurs ainsi surchargés

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (21/24)

Page 88: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

La forme canonique de Coplien (FCC)

class CFract{

int a, b;// ...public:

CFract (); // constructeur par defautCFract (const CFract &); // constructeur de copieCFract& operator= (const CFract &); // operateur d'affectation~CFract (); // destructeur

};

Les classes vérifiant la FCC sont utilisables sans effets indésirables dans les cassuivants

• création d’une instance de la classe

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (22/24)

Page 89: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

La forme canonique de Coplien (FCC)

class CFract{

int a, b;// ...public:

CFract (); // constructeur par defautCFract (const CFract &); // constructeur de copieCFract& operator= (const CFract &); // operateur d'affectation~CFract (); // destructeur

};

Les classes vérifiant la FCC sont utilisables sans effets indésirables dans les cassuivants

• création d’une instance de la classe

• utilisation de la classe comme valeur de retour d’une fonction

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (22/24)

Page 90: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

La forme canonique de Coplien (FCC)

class CFract{

int a, b;// ...public:

CFract (); // constructeur par defautCFract (const CFract &); // constructeur de copieCFract& operator= (const CFract &); // operateur d'affectation~CFract (); // destructeur

};

Les classes vérifiant la FCC sont utilisables sans effets indésirables dans les cassuivants

• création d’une instance de la classe

• utilisation de la classe comme valeur de retour d’une fonction

• création d’un tableau d’instances de la classe

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (22/24)

Page 91: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

La forme canonique de Coplien (FCC)

class CFract{

int a, b;// ...public:

CFract (); // constructeur par defautCFract (const CFract &); // constructeur de copieCFract& operator= (const CFract &); // operateur d'affectation~CFract (); // destructeur

};

Les classes vérifiant la FCC sont utilisables sans effets indésirables dans les cassuivants

• création d’une instance de la classe

• utilisation de la classe comme valeur de retour d’une fonction

• création d’un tableau d’instances de la classe

L’opérateur d’affectation est responsable de recopier tous les champs et desallocations mémoire si nécessaire (comme un constructeur de copie valide).

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (22/24)

Page 92: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

La forme canonique de Coplien (FCC)

Exemple implémentation opérateur d’affectation

CFract& CFract :: operator= (const CFract & obj){if(this != &obj){

this ->a = obj.a;this ->b = obj.b;

}return *this; // renvoie l'instance recopiee

}

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (23/24)

Page 93: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Passage des objets en paramètre

Les options pour passer des paramètres :

• par valeur : lent car ils sont copiés

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (24/24)

Page 94: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Passage des objets en paramètre

Les options pour passer des paramètres :

• par valeur : lent car ils sont copiés

• par adresse : possible mais déconseillé

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (24/24)

Page 95: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Passage des objets en paramètre

Les options pour passer des paramètres :

• par valeur : lent car ils sont copiés

• par adresse : possible mais déconseillé

• par référence : efficace mais on peut modifier l’instance passée enparamètre

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (24/24)

Page 96: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Passage des objets en paramètre

Les options pour passer des paramètres :

• par valeur : lent car ils sont copiés

• par adresse : possible mais déconseillé

• par référence : efficace mais on peut modifier l’instance passée enparamètre

• par référence const : efficace et safe

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (24/24)

Page 97: Programmation Orientée Objet en C++hebergement.u-psud.fr/emi/443/cours2-objets-eleves-gs.pdf · L’approche objet La notion de classe • un type de données parmi d’autres E

Passage des objets en paramètre

Les options pour passer des paramètres :

• par valeur : lent car ils sont copiés

• par adresse : possible mais déconseillé

• par référence : efficace mais on peut modifier l’instance passée enparamètre

• par référence const : efficace et safe

Quand il ne faut pas utiliser des références pour les paramètres :

• pour des tableaux

• pour des types de base

E. Aldea (M1-E3A) POO C++ Chap II : Les objets (24/24)