28
1 Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 65 - Classe et Objet Passage d’une structure vers une classe Encapsulation Manipulation des membres privés Initialisation et affectation Le pointeur courant this Constructeur et destructeur Tableaux d’objets Règles de visibilité des objets !!! Surcharge des opérateurs Patrons : Fonctions et classes Amies : fonctions et classes Héritage C++ et Programmation Objet S3 Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 66 - Un objet est une instance du type abstrait «classe» et une classe est un nouveau type de donnée, un modèle qui est caractérisé par : * une identité * un ensemble d’attributs (propriétés) décrivant son état * un ensemble d’opérations/d’actions (méthode, fonction) définissant son comportement. Programmation Orientée Objet (POO) est basée sur la notion d’objet. Nom_Classe Attributs Méthodes A partir de la classe on peut créer plusieurs objets = instances. Ces instances auront les mêmes attributs mais avec des valeurs différentes. On peut aussi faire des fonctions (Méthodes) qui agissent sur les instances. Classe et Objet

C++ et Programmation Objet

  • Upload
    others

  • View
    13

  • Download
    0

Embed Size (px)

Citation preview

Page 1: C++ et Programmation Objet

1

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 65 -

Classe et Objet

Passage d’une structure vers une classe

Encapsulation

Manipulation des membres privés

Initialisation et affectation

Le pointeur courant this

Constructeur et destructeur

Tableaux d’objets

Règles de visibilité des objets !!!

Surcharge des opérateurs

Patrons : Fonctions et classes

Amies : fonctions et classes

Héritage

C++ et Programmation Objet

S3

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 66 -

Un objet est une instance du type abstrait «classe» et une classe est un nouveau type de donnée, un modèle qui est caractérisé par :* une identité* un ensemble d’attributs (propriétés) décrivant son état* un ensemble d’opérations/d’actions (méthode, fonction) définissant son comportement.

Programmation Orientée Objet (POO) est basée sur la notion d’objet.

Nom_Classe

Attributs

Méthodes

A partir de la classe on peut créer plusieurs objets = instances.

Ces instances auront les mêmes attributs mais avec des valeurs différentes.

On peut aussi faire des fonctions (Méthodes) qui agissent sur les instances.

Classe et Objet

Page 2: C++ et Programmation Objet

2

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 67 -

Exemple :

Voiture

MarqueCouleurVitesse

Avancer()Transporter_P()

Classe : Voiture

Objets = instances qui ont les mêmes attributs Marque, Couleur et Vitesse mais avec des

valeurs différentes.

Les fonctions = méthodes qui agissent sur nos instances : Avancer() et Transporter_P().

Ferrari SF90; Rouge; 340. Mercedes Vito; Blanche; 170.

Classe Instances

Classe et Objet

Nom_Classe

Attributs

Méthodes

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 68 -

Classe

Instances

Compte Bancaire

Numéro Solde

Ouvrir()Fermer()Déposer()Retirer()méthodes

attributs

Classe et Objet

Exemple :

Page 3: C++ et Programmation Objet

3

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 69 -

Une Affaire de Détails

John Lee HancockJohn Lee Hancock

2021

Anna

Luc BessonLuc Besson

2019 Naruto the Last, le film

Tsuneo KobayashiMasashi

Kishimoto

2015

Classe et Objet

Exemple :

Nom_Film

RéalisationScénario

Date de sortie

Kung Fu Panda

Mark OsborneEthan Reiff

2008

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 70 -

Cardiologues

NomPrénom

Code_INAMI

Action_1()Action_2()

Dentistes

NomPrénom

Code_INAMI

Action_3()Action_4()

Radiologues

NomPrénom

Code_INAMI

Action_5()Action_6()

Classe et Objet

Exemple :

Médecin

NomPrénom

Code_INAMI

Action_I()Action_II()

Page 4: C++ et Programmation Objet

4

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 71 -

Un objet est une instanciation d’une classe.

Cet objet possède tous les attributs et toutes les fonctions membres de la classe,

mais avec des valeurs d’attributs propres à l’objet.

class Voiture {private : string Marque ;

string Couleur;int Vitesse;

public:void Avancer();int Transporter_P();

};

classe VoitureAttributs :MarqueCouleur Vitesse

Méthodes:Avancer

Transporter_P

classe VoitureAttributs :MarqueCouleur Vitesse

Méthodes:Avancer

Transporter_P

MercedesBlanche170

MercedesBlanche170

Ferrari Rouge340

Ferrari Rouge340

instance instance Notations UML d'une classe

Deux objets Voiture

Classe & Objet

Voiture

-Marque : string-Couleur : string-Vitesse : entier

+Avancer() : void+Transporter_P() : int

Classe et Objet

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 72 -

Diagramme de classes (class diagram)

Diagramme de séquence (sequencediagram)

Diagramme de cas d’utilisation (use case diagram)…

Structure

Comportement

Fonctionnalité

Modélisation

13 types de diagrammes

Classe et Objet

Page 5: C++ et Programmation Objet

5

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 73 -

Le diagramme de classes est considéré comme le plus important de la modélisation orientée objet.

Relations entre classes

Une association est une relation entre deux classes (association binaire) ou plus (association n-aire), qui décrit les connexions structurelles entre leurs instances.

Personne ComptePropriétaire

1

Possède

0 .. N

Une classe peut être composée de plusieurs classes (Voiture contient des roues).

Voiture MoteurRoue 1 14 1

ModélisationClasse et Objet

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 74 -

• initialise pour attribuer des valeurs aux "coordonnées" d'un point ;• affiche pour afficher un point .

struct point {int x ; int y ;

void initialise (int, int) ;void affiche () ;

} ;

X1Y1initialise();affiche();

X2Y2initialise();affiche();

X3Y3initialise();affiche();

comportant des fonctions membres

structure + fonctions

Fonctions membres :

Structure

Page 6: C++ et Programmation Objet

6

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 75 -

#include <iostream>using namespace std ;

struct point {int x, y ; void initialise (int, int) ;void affiche () ;

} ;

void point::initialise (int abs, int ord) {x = abs ; y = ord ;

}

void point::affiche () {cout << "Je suis en " << x << " " << y << endl ;}

void Affiche2(point A, point B) { // fonction non membre

cout << "\n ....Je suis dans Affiche2 ...."<<"\n" ;A.affiche();B.affiche();

}

point::initialise

opérateur de "résolution de portée"

structure + fonctions

Définition et déclaration des fonctions membresStructure

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 76 -

Je suis en 5 2Je suis en 1 -1

..Je suis dans Affiche2 ..Je suis en 5 2Je suis en 10 30

#include <iostream> …

struct point { int x, y ; void initialise (int, int) ;void affiche () {

cout << "Je suis en " << x << " " << y << endl ;}

} ;

void point::initialise (int abs, int ord) {x = abs ; y = ord ;

}

void Affiche2(point A, point B) { // fonction non membre

cout << "\n ..Je suis dans Affiche2 .."<<"\n" ;A.affiche(); B.affiche();

}

void main() { point a, b, c ; // on peut accéder aux "membre " avec .

a.initialise (5, 2) ; a.affiche () ;b.initialise (1,-1) ; b.affiche () ;c.x = 10; c.y=30;Affiche2(a, c);

}

Exécution

structure + fonctions

Définition et déclaration des fonctions membresStructure

Page 7: C++ et Programmation Objet

7

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 77 -

struct point {int x, y ;

void initialise (int, int) ;void affiche ( ) ;

} ;

void point::initialise (int abs, int ord) {x = abs ; y = ord ;

}

struct point {int x, y ;

void initialise (int abs, int ord) {x = abs ; y = ord ;

}

void affiche () ;

} ;

meilleure lisibilité du programme!!!

structure + fonctions

Définition et déclaration des fonctions membresStructure

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 78 -

nom1Id1saisie();affiche();

nom2Id2saisie();affiche();

nom3Id3saisie();affiche();

nom4Id4saisie();affiche();

T[0] T[1] T[2]struct Etudiant {

int Id;string nom;void saisie();void affiche();

};

void Affichage(Etudiant T[], int n) {for( int i =0; i<n;i++)

T[i].affiche();}

void Etudiant::affiche() {cout<<"\t ID:"<< Id <<"\t Nom:"<< nom <<endl;

}

Tableau de structures

structure + fonctions

// afficher un seul élément du tableau

// On appelle la fonction affiche() de // chaque élément du tableau

Structure

Page 8: C++ et Programmation Objet

8

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 79 -

Modélisation de la Gestion des Étudiants FPMs

Structure oui, mais!!

L’UMONS veut ré-informatiser son système d'information qui gère les étudiants.

Sachant que :

· Un étudiant est caractérisé par [no. matricule, nom, prénom, date de naissance, adresse,

Email, moyenne, … ].

· Une classe est caractérisée par son nom et par une indication du groupe ou spécialité ainsi que

par le nombre d’étudiants qui la fréquente.

On désire également saisir tous les enseignants dans le système d'information. Un enseignant

est caractérisé par un code interne (CodeEnsieg), nom, prénom, statut, Email, salaire et la/les

matière(s) qu'il enseigne.

Une matière (cours) peut être composée de cours, T.P. et Exercices.

Cahier des charges

structure + fonctions

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 80 -

Etudiant

N° MatriculeNomPrénomDate_NaisEmailAdresseMoyenne…

Enseigner

Année

Enseignant

Code.EnseigNomPrénomStatutEmailSalaire…

Matière

Code.MatIntituléECTS…

Structure oui, mais!!

Modélisation de la Gestion des Étudiants FPMs

structure + fonctions

Page 9: C++ et Programmation Objet

9

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 81 -

Tache

N° IdNomDébutFin…

Partenaire

Code.PartNomDescription…

Projet

Code.ProjIntituléDébutFin…

Structure oui, mais!!

Modélisation de la Gestion de projet

Est composéEst associé

Rôle1,N1,1 0,N0,N

Tache

# Id : intNom : stringDébut : dateFin : date…

Partenaire

Code.PartNomDescription…

Projet

Code.ProjIntituléDébutFin…

1..

Est associé

Rôle : string…

Modèle UML

Modèle C.D.

structure + fonctions

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 82 -

struct Patient {// Données membres

string Nom, Prenom; string maladies;

// Fonctions membres

void Saisir ();void Afficher ();

};

struct Medecin {// Données membres

string Nom, Prenom; string INAMI;

// Fonctions membres

void Saisir ();void Afficher ();

};

struct Client {// Données membres

string Nom; string Adresse;

// Fonctions membres

void Saisir ();void Afficher ();

};

Structure oui, mais!!

struct Banque {// Données membres

string Nom; …

};

structure + fonctions

Page 10: C++ et Programmation Objet

10

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 83 -

Tous les attributs d'une classe doivent "toujours" être privéspour ne pas être modifier depuis l'extérieur de la classe.

On ne peut accéder à un objet que grâce à ses méthodes publiques (l'interface de l'objet).

Classe & Objet

Classe et Objet

masquage des données

Accessibles depuisl'extérieur de la classe

class Patient {private:// Données membres

string Nom, Prenom; string maladies;

public :// Fonctions membres

void Saisir ();void Afficher ();

};

Cachées auxfonctions externes

L’encapsulation est un concept OO qui permet de protéger l’information contenue dans un objet.

Données privées → accès uniquement par les fonctions membres (public)

Encapsulation

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 84 -

Ces mots clés peuvent apparaître à plusieurs reprises dans la définition d'une classe.

class X { private :

...public :

...private :

...protected :

...} ;

Un membre déclaré public dans une classe peut être accédé par toutes les autres classes et fonctions.

Un membre déclaré private dans une classe ne peut être accédé que par les autres membres de cette même classe.

Un membre déclaré protected dans une classe ne peut être accédé que par les autres membres de cette même classe ainsi que par les membres des classes dérivées.

masquage des données

Classe et Objet

Encapsulation

Page 11: C++ et Programmation Objet

11

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 85 -

Structure d’une classe

class point {private :int x ; int y ;

public :void initialise (int, int) ;void affiche () ;

} ;

Données

Méthodes

class Voiture {public: ...private:

Roue roueAvantGauche;Roue roueAvantDroite;…

}

class Roue { public: ... private: ...

};

Point

- x: int- y : int

+ initialise(int,int) : void

+ affiche() : int

EncapsulationClasse et Objet

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 86 -

class point {private :int x ; int y ;

public :void initialise (int, int) ;void affiche () ;

} ;

class point {

int x ; int y ;

public :void initialise (int, int) ;void affiche () ;

} ;

class point {public :int x ; int y ;

void initialise (int, int) ;void affiche () ;

} ;

struct point {

int x ; int y ;

void initialise (int, int) ;void affiche () ;

} ;

Structure d’une classeEncapsulation

Classe et Objet

Page 12: C++ et Programmation Objet

12

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 87 -

void point::initialise (int abs, int ord) {x = abs ; y = ord ;

}void point::affiche () {cout << "Je suis en " << x << " " << y << "\n" ;

}

void main() { point a, c ; a.initialise (5, 2) ; a.affiche () ; a.z = 9;cout << " Valeur de z = " << a.z << endl;

c.z = 15;cout << " Valeur de z = " << c.z << endl;

c.x = 10; c.y=30;c.affiche ();

}

class point { private: int x, y;public :int z;void initialise (int, int) ;void affiche () ;

} ;

struct point { int x, y;

int z;void initialise (int, int) ;void affiche () ;

} ;

error C2248: 'point::x' : impossible d'accéder à private membre déclaré(e) dans la classe 'point'

Je suis en 5 2Valeur de z = 9Valeur de z = 15Je suis en 10 30

Exécution

Classe et Objet

Classe & Objet

Encapsulation

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 88 -

#include <iostream>using namespace std;#include <cmath>

class Point {public:float x,y;float distance( Point P);Point milieu( Point P);

};

float Point::distance( Point P) {float dx,dy;dx = x - P.x ; dy = y - P.y ;return sqrt(dx*dx + dy*dy);

}

Point Point::milieu( Point P) {Point M;M.x = (P.x+x) /2; M.y = (P.y+y) /2;return M;

}

void main() { Point A, B, C;float d;A.x = 4 ; A.y = 3 ;B.x = 5 ; B.y = 8 ;C = A.milieu(B);d = A.distance(B);cout << endl;cout << "MILIEU DE AB" << endl;cout << "L'abscisse vaut : " << C.x << endl;cout << "L'ordonnée vaut : " << C.y << endl;cout << "La distance AB vaut :" << d << endl;

}

Exécution

MILIEU DE ABL'abscisse vaut : 4.5L'ordonnée vaut : 5.5La distance AB vaut : 5.09902

Classe et Objet

Classe & Objet

Encapsulation

Page 13: C++ et Programmation Objet

13

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 89 -

Programmation orientée objet !!

TRI

MinMax

Inverser

Fusionner

Code

Les attributs = les variables dans le code

Moyenne

Le contenu de l'objet = "boîte noire". On ne sait pas comment ça fonctionne à l'intérieur quand on l'utilise. C'est une sécurité.

Le but du modèle objet est de masquer les informations complexes à l'utilisateur (les attributs) pour éviter qu'il ne fasse des «bêtises» avec.

Exemple : conducteur peut démarrer le moteur mais pas l’ouvrir et …

Interface

TRI

Min

Max

Inverser

Fusionner

Les boutons sur la façade avant, ce sont les méthodes.

on n’y peut accéder que par les méthodes publiques.

Classe & Objet

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 90 -

#include ...

class point { int x, y

public : void affiche () ;} ;

void main() {

point a ; // 1 objet de type point

point * C; // 1 objet de type point

C = new point();a.affiche () ;C→affiche(); // ou (*C).affiche();

}

Il existe deux façons de créer des objets, c'est-à-dire d'instancier une classe :

1) de façon statique (point a; )2) de façon dynamique (point * C;)

delete C;

Un objet !!

Classe & Objet

Un objet est une instanciation d’une classe.

Cet objet possède tous les attributs et toutes les fonctions membres de la classe,

mais avec des valeurs d’attributs propres à l’objet.

Page 14: C++ et Programmation Objet

14

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 91 -

cannot access private member declared in class ‘point'

Accesseurs et mutateurs :

On accède aux valeurs des données membres privées grâce à des méthodes spécifiques appelées accesseurs. Les accesseurs seront publics.

On modifie ces valeurs grâce à des fonctions spécifiques appelées mutateurs.

Manipulation des membres privés

#include <iostream>using namespace std;

class point {int x, y;};

void main() {point Obj;int Som;Obj.x = 5;Obj.y = 3;cout << " Somme des attributs: ";Som = Obj.x + Obj.y;cout << Som << endl;

}

Classe & Objet

// K.O. Erreur de compilation

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 92 -

Manipulation des membres privés

#include <iostream>using namespace std;

class point {int x, y;};

void main() {point Obj;int Som;Obj.x = 5;Obj.y = 3;cout << " Somme des attributs: ";Som = Obj.x + Obj.y;cout << Som << endl;

}

Classe & Objet

#include …

class point {int x, y;

public :

} ;

void main() {point Obj;int Som;

cout << " Somme des attributs: " ;

cout << Som << endl;}

void initialise (int abs, int ord) {x = abs ; y = ord ;

}

int getX() { return x; }int getY() { return y; } accesseurs

mutateur

Obj.initialise(5,3);

Som = Obj.getX() + Obj.getY();

#include <iostream>using namespace std;

class point {int x, y;};

void main() {point Obj;int Som;Obj.x = 5;Obj.y = 3;cout << " Somme des attributs: ";Som = Obj.x + Obj.y;cout << Som << endl;

}

#include …

class point {int x, y;

public :

} ;

void main() {point Obj;int Som;

cout << " Somme des attributs: " ;

cout << Som << endl;}Somme des attributs : 8

Page 15: C++ et Programmation Objet

15

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 93 -

#include <iostream>using namespace std;

class CRec {public:int Long, Larg;

int CalcSurf() { return (Long*Larg); }};

void main() {CRec Rc1, Rc2;int Surface = 0;Rc1.Long = 30;Rc1.Larg = 24;Rc2.Long = Rc1.Long / 2;Rc2.Larg = Rc1.Larg * 2;Surface = Rc1.CalcSurf();}

Initialisation et affectation Données membres : public et private

Classe & Objet

Si on déclare Long, Larg comme private;

Alors

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 94 -

class CRec {int Long, Larg;public:

int CalcSurf() { return (Long*Larg); }void initialise(int Lo, int La) {

Long = Lo; Larg = La;}int R_Long() { return Long; }int R_Larg() { return Larg; }

};

void main() {CRec Rc1, Rc2;int Surface = 0;Rc1.initialise(30, 24);Rc2.initialise(Rc1.R_Long() / 2, Rc1.R_Larg() * 2);Surface = Rc1.CalcSurf();cout << endl << "Surface rectangle 1 = " << Surface;cout << endl << " Surface rectangle 2 = " << Rc2.CalcSurf();

}

Données membres : public et private

Classe & Objet

Initialisation et affectation

Page 16: C++ et Programmation Objet

16

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 95 -

Le constructeur :* porte le nom de sa classe,* définit l'initialisation d'une instance, * est appelé implicitement à toute création d'instance, * n'a pas de type de retour (même pas void), * peut admettre des arguments qui sont en fait les valeurs

d’initialisation des différents champs de la variable.

class point {int x, y ;

public :

point (int, int) ; // constructeur

point (float, float) ; // constructeur

point () ; // constructeur

} ;

Un constructeur est une fonction membre d’initialisation exécutée automatiquement à chaque création d'un objet.

Constructeur et destructeur

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 96 -

Le destructeur :* porte le nom de sa classe précédé d'un tilde (~),* définit la "désinitialisation" d'une instance, * est appelé implicitement à toute disparition d'instance, * n'a pas de type de retour (même pas void), * est une fonction membre non typée et sans paramètre.

class point {int x, y ;

public :

point (int, int) ; // constructeur

point () ; // constructeur

~point () ; // 1 destructeur

} ;

Possibilité de plusieurs constructeurs (surcharge de méthodes) mais un seul destructeur par classe !

Un destructeur est une fonction membre appelée automatiquement au moment de la destruction de l'objet.

Constructeur et destructeur

Page 17: C++ et Programmation Objet

17

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 97 -

Un constructeur par défaut est un constructeur qui n’a pas d’argument ou dont tous les arguments ont des valeurs par défaut.

A::A(); // Sans arguments ! A::A(int X=0, int Y=5); // Valeurs par défaut des arguments !

Rôle : il crée une instance non initialisée quand aucun autre constructeur fourni n’est applicable.

class Etudiant {private : int Id ;

string Nom ;public :

Etudiant() { // Constructeurcout << "Dans constructeur"<<endl; Id = -1 ; Nom = "Vide";

}

};

class point {int x, y ;

public :point () { // constructeur

x = 0; y = 0;}~ point () { // destructeur

x= -1; y = -1;}

} ;

Les données membres sont créées mais ne sont pas initialisées

Constructeur par défaut

Constructeur & destructeur

A::A(); exemple :

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 98 -

#include <iostream>#include <string>using namespace std;

class Etudiant {private:

int Id; string Nom;

public:Etudiant() { // Constructeur

cout << "Dans constructeur" << endl;}

};

Dans constructeurDans constructeurDans constructeur

void main() {Etudiant Etud;Etudiant Etud1;Etudiant Etud2;

}

Exemple de constructeur par défaut sans paramètres

Exécution

Constructeur & destructeur

Constructeur par défaut

Page 18: C++ et Programmation Objet

18

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 99 -

#include <iostream>#include <string>using namespace std;

class Etudiant {private: int Id; string Nom;public:Etudiant() { // Constructeur

cout << "Dans constructeur" << endl;Id = -1; Nom = "Vide";

}~Etudiant() { // Destructeur

cout << "Dans destructeur\n";}

void Affiche() {cout << " Id = " << Id << " et nom : " << Nom << endl;}void modif(int p1, string p2);

};void Etudiant::modif(int p1, string p2) {cout << "Dans Modif" << endl;Id = p1; Nom = p2;

}

Dans constructeurId = -1 et nom : Vide

Dans ModifId = 9 et nom : Toto

Dans destructeur

void main() {Etudiant Etud; Etud.Affiche();Etud.modif(9, "Toto");Etud.Affiche();

}

Exemple de constructeur par défaut sans paramètres

Exécution

Constructeur & destructeur

Constructeur par défaut

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 100 -

class Cpte_obj {static int ctr; // compteur du nombre d'objets créés

public:Cpte_obj();~Cpte_obj();

};

// initialisation du membre statique ctr

int Cpte_obj::ctr = 0;

Cpte_obj::Cpte_obj() { // constructeurcout << "++ constr. il y a : " << ++ctr << " objet(s)\n";

}

Cpte_obj::~Cpte_obj() { // destructeurcout << "-- destr. il reste " << --ctr << " objet(s)\n";

}

void fct() {Cpte_obj u, v;

}

int main() {Cpte_obj A; fct () ;Cpte_obj B ;return 1;

}

++ constr. il y a : 1 objet(s)++ constr. il y a : 2 objet(s)++ constr. il y a : 3 objet(s)-- destr. il reste 2 objet(s)-- destr. il reste 1 objet(s)++ constr. il y a : 2 objet(s)-- destr. il reste 1 objet(s)-- destr. il reste 0 objet(s)

Exécution

Compter le nombre d’instances d’une classe actives à un moment donné dans un programme.◮ le constructeur incrémente le compteur ctr ◮ le destructeur le décrémente

Constructeur & destructeur

Exemple de constructeur par défaut sans paramètres

Constructeur par défaut

Page 19: C++ et Programmation Objet

19

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 101 -

class Etudiant {private : int Id ; char code ;public:Etudiant() { // Constructeur

cout << "Dans constructeur"<<endl; static i=1; // compteur du nombre d'objets créés

static char K='A';Id = i;code = K;

i++;K++;

}…

void main() {Etudiant E1; E1.Affiche();Etudiant E2; E2.Affiche();Etudiant E3; E3.Affiche();

}

Dans constructeur………

Exécution

Constructeur & destructeur

staticExemple de constructeur par défaut sans paramètres

Constructeur par défaut

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 102 -

class CRec {int Long, Larg; public:void initialise(int Lo, int La) {

Long = Lo; Larg = La;}

};

class CRec {int Long, Larg; public:CRec (int Lo, int La) {

Long = Lo; Larg = La;}

};

CRec Rc1;Rc1.initialise(30, 24); CRec Rc1(30, 24);

Constructeur & destructeur

Constructeur par paramètres

Page 20: C++ et Programmation Objet

20

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 103 -

class Tab {int dim, *TabD;

public :Tab ( int dim ) {

TabD = new Tab [dim] ;

}~ Tab () {

delete [] TabD ; }

};

Constructeur & destructeur

Constructeur par paramètres

Exemples :

class Arbre { int contenu; Arbre filsG, filsD;

public:Arbre(Arbre g, int c, Arbre d) {

filsG = g; contenu = c; filsD = d;

}} ;

class Polynomes {int coeff, degre;Pol suivant;

public:Pol(int c, int d, Pol p) {

coeff = c;degre = d;suivant = p;

}};

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 104 -

#include <iostream>using namespace std;class CRec {int Long, Larg;public:

CRec(int Lo, int La) { // constructeurcout << "In Constructeur Param" << endl;Long = Lo; Larg = La;

} CRec() {cout << "In Constructeur SP" << endl;}

int CalcSurf() { return (Long*Larg); }};

void main() {CRec Rc1(10, 20), Rc2;

cout << "\n Surface rectangle 1 = " << Rc1.CalcSurf();

Rc2 = Rc1;

cout << "\n Surface rectangle 2 = " << Rc2.CalcSurf();}

In Constructeur Param………

Exécution

Constructeur & destructeur

Constructeur par paramètres

Exemples :

In Constructeur ParamIn Constructeur SP

Surface rectangle 1 = 200Surface rectangle 2 = 200

Page 21: C++ et Programmation Objet

21

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 105 -

Un constructeur par défaut et par paramètres est un constructeur possédant des paramètres avec des valeurs de défaut.

class CRec {int Long; int Larg;

public:CRec( int Lo=0, int La=0){

Long = Lo;Larg = La;

}};

CRec X; // OKCRec Y(1); // OKCRec Z(1,2); // OK

constructeur (0, 1 ou 2 arguments)

Constructeur & destructeur

Constructeur par défaut et par paramètres

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 106 -

Les tableaux d’objets

class point { int x, y ;

public :point () ; // constructeur

~ point (); // destructeur

} ;

Une des solutions : point Tab[] = { point(1,1) , point(4,5), point (7,8) } ;

class point{ int x, y ;public : point (int, int) ; // constructeur

~ point (); //destructeur

} ;

point Tab[3] ; // K.O. Erreur de compilation

Constructeur & destructeur

point courbe[10], *Dcourbe; // OKDcourbe = new point[30]; // OK

Page 22: C++ et Programmation Objet

22

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 107 -

#include <iostream>using namespace std;

class point {int x, y;public:

point(int abs = 0, int ord = 0) {x = abs; y = ord;cout << "++ Constr : " << x << " " << y << "\n";

}

~point() {cout << "-- Destr : " << x << " " << y << "\n";

}};

void main() {int n = 3;point courbe[6] = { 7, n, 2 * n + 5, point(1,2) };cout << "*** fin programme ***\n";

}

++ Constr : 7 0++ Constr : 3 0++ Constr : 11 0++ Constr : 1 2++ Constr : 0 0++ Constr : 0 0*** fin programme ***-- Destr : 0 0-- Destr : 0 0-- Destr : 1 2-- Destr : 11 0-- Destr : 3 0-- Destr : 7 0

Exécution

Constructeur & destructeur

Les tableaux d’objets

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 108 -

Le mot clé this permet de désigner l'objet dans lequel on se trouve. this est passée en tant que paramètre caché de chaque fonction membre.

Il permet d’accéder à une donnée membre d'un objet à partir d'une fonction membre du même objet.

void initialise (int x, int y) {this->x = x ; this-> y = y ;

}

void initialise (int abs, int ord) {x = abs ; y = ord ;

}

Implicitementthis->x

this

Le pointeur courant this

void initialise (int x, int y) {x = x ; y = y ;

}

Accéder aux attributs en cas d’ambiguïté

Page 23: C++ et Programmation Objet

23

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 109 -

this est indispensable dans le cas où l'on désire qu’une fonction membre retourne un pointeur vers l'objet dans lequel elle se trouve.

class Toto {private :int age;

public :void DefineTotoAge(int);Toto * RetourneToto();

};void Toto::DefineTotoAge(int age) {

this->age = age;}Toto * Toto::RetourneToto() {

return this;}

Chaque objet (ici de type Personnage) possède un pointeur this qui pointe vers... l'objet lui-même !

Personnage* Personnage::getAdresse() { return this; }

this étant un pointeur sur un objet, *this est l'objet lui-même

this est un pointeur constant, on ne peut donc pas le modifier.

this

Le pointeur courant this

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 110 -

Appels en cascade de this

Équivalent àobjet.incrementer();objet.incrementer();objet.incrementer();

class K {private: int Val;public:

K() { Val = 0; }

int RetourVal() { return Val; }

K& incrementer();};

K& K::incrementer() {Val++;cout << " Val= " << Val;return *this;

}

void main() {K objet;cout << " Val = " << objet.incrementer().incrementer().incrementer().RetourVal() << endl;objet.incrementer();

}

Exécution

Val= 1 Val= 2 Val= 3 Val = 3Val= 4

this

Le pointeur courant this

Page 24: C++ et Programmation Objet

24

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 111 -

#include<iostream>using namespace std;

class KLa {private: int x;public :

KLa & set (int i) { x=i; return *this ; } KLa & add (int i) { x+=i; return *this ; }KLa & sub (int i) { x-=i; return *this ; }int get_x () { return x; }

};

int main() {KLa A;cout<< A.set(10).add(15).sub(3).get_x() << endl;

return 1;}

Le pointeur this permet d’obtenir une référence sur l’instance, plutôt qu’un pointeur. Cela permet d’enchaîner plusieurs appels de méthodes.

Exécution

10 + 15 - 3 : 22

Le pointeur courant this

this

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 112 -

5.4. 5.5. 5.6. 5.7.

Règles de visibilité des objets !!!

5.3.

Constructeur & destructeur

Page 25: C++ et Programmation Objet

25

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 113 -

#include <iostream>using namespace std;

class E {public : int x, y ;

E () { // constructeur

cout << " +++ Const " << endl; }

~ E (){ // destructeur

cout << " --- Destr " << endl; }

};

void Fonct1() {cout << " ===== Fonct1 " << endl;

E Obj1, Obj2;Obj1.x=10, Obj1.y=20;

}

void main( ) {cout << " ***** main " << endl;

E V;

Fonct1();

cout << " ***** Fin main " << endl;

}

Variable locale

E Glob;

Variable globale

visibilité des objets

Règles de visibilité des objets

+++ Const***** main+++ Const===== Fonct1+++ Const+++ Const--- Destr--- Destr***** Fin main--- Destr--- Destr

Exécution

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 114 -

#include <iostream>using namespace std;

class point { int x, y;public:point(int abs, int ord) { x = abs; y = ord;cout << "++ Construction d'un point : " << x << " " << y << "\n";

}~point() { cout << "-- Destruction du point : " << x << " " << y << "\n";

}};

point a(1, 1); // variable globale construite avant le début //de l’exécution de la fonction main

void fct() {cout << " ====== Debut Fct \n";point b(10, 10), c(3, 3); // Local dans la fonctioncout << " ====== Fin Fct \n";}void main() {cout << "****** Debut main *****\n";fct();point d(20, 20);for (int i = 1; i<3; i++) {cout << " ---->> Boucle tour numero " << i << "\n";point b(i, 2 * i); // objets créés dans un bloc}

cout << "****** Fin main ******\n";}

****** Debut main *****====== Debut Fct

++ Construction d'un point : 10 10++ Construction d'un point : 3 3

====== Fin Fct-- Destruction du point : 3 3-- Destruction du point : 10 10++ Construction d'un point : 20 20--->> Boucle tour numero 1++ Construction d'un point : 1 2-- Destruction du point : 1 2--->> Boucle tour numero 2++ Construction d'un point : 2 4-- Destruction du point : 2 4****** Fin main ******-- Destruction du point : 20 20

++ Construction d'un point : 1 1

-- Destruction du point : 1 1

Exécution

Exemple

Page 26: C++ et Programmation Objet

26

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 115 -

class E {public: int x, y;

E() { cout << " +++ Const " << endl; }~E() { cout << " --- Destr " << endl; }

};

void fonct2(E &a) {cout << " ***** Fct 2 " << endl;E S;a.x = 1; a.y = 2; S.x = 5; S.y = 7;

}

void fonct3() {cout << " ***** Fct 3 " << endl;static E B;B.x = 1; B.y = 2;}

void main( ) {cout << " ***** main " << endl;

E V;V.x = V.y = 0;fonct2(V);cout << V.x << V.y << endl;fonct3();fonct3();cout << " ***** Fin main " << endl;

}

***** main+++ Const***** Fct 2+++ Const--- Destr

1 2***** Fct 3+++ Const***** Fct 3***** Fin main--- Destr--- Destr

// E V;

// E S;

// E S;

// E B;

// E B;

// E V;

Exemple

Appel par références et variable static ?!

Exécution

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 116 -

Le constructeur de copie (ou de recopie) est spécialisé dans la création etl’initialisation d’un objet à partir d’un autre objet pris comme modèle. Il est doncappelé lorsqu’on doit créer une instance d’un objet qui est la copie d’un autre objet.

C’est un constructeur dont le premier paramètre est de type « C & » (référence surun C) ou « const C &» (référence sur un C constant) et dont les autres paramètres,s'ils existent, ont des valeurs par défaut.

La syntaxe habituelle d’un constructeur de copie est la suivante :point::point(const point& Pt) // Pt est l'objet à copierpoint(const point& Pt) // Si définition dans la classe

Constructeur & destructeur

Constructeur de copie

Page 27: C++ et Programmation Objet

27

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 117 -

class E {public: int x, y;

E() { cout << " +++++ Const " << endl; }~E() { cout << " ----- Destr " << endl; }E(E &) { cout << "\n ++ const. +++ copie \n"; }

};

E Glob;

void fonct1(E a) {cout << " ***** Fct 1 " << endl;a.x = 3; a.y = 4;

}

void main( ) {cout << " ***** main " << endl;E V;V.x = V.y = 0;fonct1(V);cout << V.x << V.y << endl;cout << " ***** Fin main " << endl;

}

+++ Const***** main+++ Const

++ const. +++ copie

***** Fct 1--- Destr0 0***** Fin main--- Destr--- Destr

Constructeur de copie

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 118 -

class demo {int x, y;public:demo(int abs = 1, int ord = 0) {x = abs; y = ord;cout << "constructeur I : " << x << " -" << y << "\n"; }

demo(demo &); // constructeur II (par recopie) ~demo() { cout << "destruction : " << x << "- " << y << "\n"; }};demo::demo(demo & d) { // ou demo::demo (const demo & d)cout << "constructeur II (recopie) : " << d.x << " -" << d.y << "\n";x = d.x; y = d.y;

}void fct(demo d, demo * add) {cout << "entree fct\n";delete add;cout << "sortie fct\n";

}

void main() {demo * adr;cout << "debut main\n";demo a , b = 2 , c = a;adr = new demo(3, 3);fct(a, adr);cout << "fin main\n";}

Constructeur & destructeur

debut mainconstructeur I : 1 - 0constructeur I : 2 - 0constructeur II (recopie) : 1 - 0constructeur I : 3 - 3constructeur II (recopie) : 1 - 0entree fctdestruction : 3 - 3sortie fctdestruction : 1 - 0fin maindestruction : 1 - 0destruction : 2 - 0destruction : 1 - 0

Exécution

Un constructeur qui sert à créer un objet identique à l’objet reçu en paramètre.

Constructeur de copie Objet dynamique

Page 28: C++ et Programmation Objet

28

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 119 -

La plupart des constructeurs ne font qu’initialiser les données membres de l’objet. Le C++ propose un dispositif appelé liste d’initialisation. L’exemple suivant illustre comment on peut réécrire les constructeurs des différents exemples à l’aide d’une liste d’initialisation.

Listes d’initialisation des constructeurs

Etudiant() {Id = -1 ; Nom = "Vide";

}

Etudiant() : Id (-1) , Nom ("Vide") { }

point (int abs, int ord) {x = abs ; y = ord ; }

point (int abs, int ord) : x (abs) , y (ord) { }

CRec (int Lo = 0, int La = 0) {Long = Lo; Larg = La;

}

CRec (int Lo = 0, int La = 0) : Long (Lo) , Larg (La) { }

Constructeur & destructeur

Université de Mons 2021-2022- M. Benjelloun M.O.O._P1 - 120 -

L’utilisation d'un constructeur n'est pas obligatoire lorsqu'il n'est pas nécessaire.

Et surtout pas d’utilisation de constructeur vide.

Constructeur & destructeur

class CRec { int Long, Larg; public:

CRec (int Lo, int La) { }};