View
10
Download
0
Category
Preview:
Citation preview
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
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 :
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()
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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é
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
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
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
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
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
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) { }};
Recommended