inf1101 algorithmes et structures de données1 cours 2 les classes et les objets (suite)
TRANSCRIPT
![Page 1: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/1.jpg)
INF1101 Algorithmes et structures de données
1
Cours 2Cours 2
Les classes et les objetsLes classes et les objets(suite)(suite)
![Page 2: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/2.jpg)
INF1101 Algorithmes et structures de données 2
Plan du cours 2Plan du cours 2
I.I. Objets et membres constantsObjets et membres constantsII.II. Pointeur Pointeur thisthisIII.III. Surcharge d’opérateursSurcharge d’opérateursIV.IV. Membres statiquesMembres statiques
![Page 3: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/3.jpg)
INF1101 Algorithmes et structures de données 3
I. Objets et membres I. Objets et membres constantsconstants
• Mot clé Mot clé constconst• Mot clé du langage spécifiant Mot clé du langage spécifiant
qu’aucune modification d’un objet, qu’aucune modification d’un objet, d’une variable ou d’un pointeur n’est d’une variable ou d’un pointeur n’est permise.permise.
• La signification du La signification du constconst dans la dans la signature d’une fonction membre signature d’une fonction membre d’une classe dépend de sa position.d’une classe dépend de sa position.
![Page 4: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/4.jpg)
INF1101 Algorithmes et structures de données 4
const (suite)const (suite)
• Attribut: la valeur est constante, fixée à la Attribut: la valeur est constante, fixée à la création de l’objet.création de l’objet.
• Fonction membre Fonction membre constconst : ne modifie pas : ne modifie pas l’objet courant, peut seulement accéder à l’objet courant, peut seulement accéder à l’information.l’information.
• Objet Objet constconst: appel seulement de fonctions : appel seulement de fonctions membres const.membres const.
![Page 5: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/5.jpg)
INF1101 Algorithmes et structures de données 5
Attribut constantAttribut constantQuestion: Question: Comment initialiser un attribut constant?Comment initialiser un attribut constant?Réponse: Réponse: Par le biais d’une liste d’initialisationPar le biais d’une liste d’initialisation
class C {class C {public:public:
C() ;C() ;......
private:private:const int x;const int x;......
};};
C::C() C::C() :x(0) :x(0) {{ ......}}
![Page 6: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/6.jpg)
INF1101 Algorithmes et structures de données 6
II. Le pointeur thisII. Le pointeur this
Le mot Le mot thisthis est un mot réservé contenant est un mot réservé contenant l’adresse de l’objet courant.l’adresse de l’objet courant.
Ce pointeur sert, entre autres, à retourner Ce pointeur sert, entre autres, à retourner une référence à cet objet pour les appels en une référence à cet objet pour les appels en cascade.cascade.ex: ex: a = b = c = d;a = b = c = d;
Il ne faut jamais retourner une référence à Il ne faut jamais retourner une référence à une variable locale.une variable locale.
![Page 7: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/7.jpg)
INF1101 Algorithmes et structures de données 7
II - II - Surcharges Surcharges d’opérateursd’opérateurs
• Surcharge des opérateurs binaires, Surcharge des opérateurs binaires, unaires, opérateur assignationunaires, opérateur assignation
• CommutativitéCommutativité et fonctions globales et fonctions globales
![Page 8: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/8.jpg)
INF1101 Algorithmes et structures de données 8
IntroductionIntroduction
La surcharge (ou surdéfinition)La surcharge (ou surdéfinition) d’opérateur est un concept qui d’opérateur est un concept qui permet d’implémenter une fonction permet d’implémenter une fonction ou un opérateur de différentes ou un opérateur de différentes façons sans en changer la méthode façons sans en changer la méthode d’appel (signature).d’appel (signature).
![Page 9: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/9.jpg)
INF1101 Algorithmes et structures de données 9
• En C/C++, il existe des variables de types simples En C/C++, il existe des variables de types simples intint, , floatfloat, , doubledouble, sur lesquelles on peut , sur lesquelles on peut effectuer des opérations arithmétiques.effectuer des opérations arithmétiques.
• En C/C++, il n’existe aucun type de base En C/C++, il n’existe aucun type de base stringstring, , d’où le besoin de créer une classe d’où le besoin de créer une classe stringstring pour pour traiter les chaînes de caractères.traiter les chaînes de caractères.
• Cette classe Cette classe stringstring posséderait tous les posséderait tous les opérateurs définis pour un type tel que un entier opérateurs définis pour un type tel que un entier ou un double (+, [], +=, etc). ou un double (+, [], +=, etc).
Besoin de la surcharge Besoin de la surcharge d’opérateurs d’opérateurs
![Page 10: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/10.jpg)
INF1101 Algorithmes et structures de données 10
Application de la surcharge Application de la surcharge d’opérateursd’opérateurs
string S1(“allo ”), S2(“le monde”), S3;
S3 = S1 + S2;
S3 = S1 + “a tous”;
S2[1] = ‘a’;
S2[3] = ‘r’;
Cet exemple est rendu possible grâce à Cet exemple est rendu possible grâce à l’utilisation de la surcharge des opérateurs l’utilisation de la surcharge des opérateurs + et [] pour la classe + et [] pour la classe stringstring..
![Page 11: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/11.jpg)
INF1101 Algorithmes et structures de données 11
Surcharges d’opérateursSurcharges d’opérateurs• Consiste à redéfinir la fonctionnalité d’un opérateur tel que +, Consiste à redéfinir la fonctionnalité d’un opérateur tel que +,
-, ou += pour une classe.-, ou += pour une classe.
• Il faut bien comprendre le fonctionnement de l’opérateur.Il faut bien comprendre le fonctionnement de l’opérateur.
• L’ordre de priorité est conservé.L’ordre de priorité est conservé.
• L’objet est toujours l’opérande de gauche. L’objet est toujours l’opérande de gauche.
• Les opérateurs gardent leur nombre de paramètres et ne Les opérateurs gardent leur nombre de paramètres et ne peuvent avoir de paramètres par défaut. ( opérateurs binaires peuvent avoir de paramètres par défaut. ( opérateurs binaires et unaires)et unaires)
• Il n’est pas possible de créer de nouveaux opérateurs.Il n’est pas possible de créer de nouveaux opérateurs.
![Page 12: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/12.jpg)
INF1101 Algorithmes et structures de données 12
Surcharges d’opérateursSurcharges d’opérateurs
Pouvant être surchargés
+ - * / % ^ & | [] () ~ = < > += -= *= /= %= ^= &= ! ++ -- -> ,>> << && != <= >= \= || <<= >>= ==new delete
. :: ?: sizeof
Ne pouvant être surchargés
![Page 13: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/13.jpg)
INF1101 Algorithmes et structures de données 13
Surcharges d’opérateurs Surcharges d’opérateurs binairesbinaires
• Opérateur à deux opérandes.Opérateur à deux opérandes.
• Il doit y avoir une opérande à gauche Il doit y avoir une opérande à gauche et à droite du symbole de l’opérateur.et à droite du symbole de l’opérateur.
![Page 14: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/14.jpg)
INF1101 Algorithmes et structures de données 14
Opérateurs binairesOpérateurs binairesstring S1(“allo”), S2(“le monde”), S3;string S1(“allo”), S2(“le monde”), S3;
S3 = S1+S2; // équivalent à S1.operator+(S2);S3 = S1+S2; // équivalent à S1.operator+(S2);
• operator+()operator+() est une fonction est une fonction membre de la classe membre de la classe stringstring, car S1 , car S1 est un objet de la classe est un objet de la classe stringstring..
• Retourne un objet Retourne un objet stringstring..
![Page 15: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/15.jpg)
INF1101 Algorithmes et structures de données 15
La classe string : string.hLa classe string : string.h
class stringclass string{{ public:public:
// Constructeurs// Constructeurs
string(char ch);string(char ch);string (const char* cstring=“”);string (const char* cstring=“”);
~string() {delete [] buffer};~string() {delete [] buffer};
// Opérations// Opérations......
string operator + (const string&) const;string operator + (const string&) const; private:private:
int strLength;int strLength;
int bufferLengthint bufferLength
char *buffer;char *buffer;
......
![Page 16: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/16.jpg)
INF1101 Algorithmes et structures de données 16
Implémentation de Implémentation de l’opérateur + de string l’opérateur + de string
string string::operator+(const string &cstr) conststring string::operator+(const string &cstr) const{{
string Concat;string Concat;
Concat = *this; // surcharge de l’opérateur =Concat = *this; // surcharge de l’opérateur =
Concat += cstr; // surcharge de l’opérateur +=Concat += cstr; // surcharge de l’opérateur +=
return Concat;return Concat;}}
Remarque: l’opérateur + est défini en fonction de l’opérateur +=
![Page 17: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/17.jpg)
INF1101 Algorithmes et structures de données 17
Implémentation de l’opérateur + de string (suite)
Que se passe-t-ilQue se passe-t-il ? ?
string S1(“allo”), S2;string S1(“allo”), S2;S2 = S1 + ”tous”; // ici il y a une conversion S2 = S1 + ”tous”; // ici il y a une conversion // implicite qui est réalisée// implicite qui est réaliséeS1.operator+(“tous”);S1.operator+(“tous”);
Conversion implicite: Conversion implicite: • On s’attend à une opérande de type On s’attend à une opérande de type stringstring• On a une opérande de typeOn a une opérande de type char* char*• Il existe un constructeur qui accepte ce type de paramètreIl existe un constructeur qui accepte ce type de paramètre• On construira donc un objet de type On construira donc un objet de type stringstring en lui passant la en lui passant la
chaîne chaîne • On pourra alors appliquer l’opérateur aux deux opérandesOn pourra alors appliquer l’opérateur aux deux opérandes
![Page 18: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/18.jpg)
INF1101 Algorithmes et structures de données 18
Conversion implicite de type• Il faut se méfier des conversions implicites, C++ peut en
faire à des endroits où on ne s’y attend pas• On peut empêcher qu’un objet soit créé par une conversion
implicite: il suffit d’ajouter explicit avant la déclaration du constructeur
• Ainsi, si on déclare le constructeur de la manière suivante:
explicit string (const char* cstring=“”);explicit string (const char* cstring=“”);
on pourra empêcher la construction d’un string dans les cas on pourra empêcher la construction d’un string dans les cas suivants:suivants:
string S1, S2;string S1, S2; S = “allo”;S = “allo”;
S2 = S1 + “allo”S2 = S1 + “allo”
![Page 19: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/19.jpg)
INF1101 Algorithmes et structures de données 19
Implémentation de Implémentation de l’opérateur + de string l’opérateur + de string (suite)(suite)
• Si on déclare le constructeur explicit, l’instruction S2 = S1 + S2 = S1 + “allo”“allo” n’est plus acceptée parce que l’opérateur n’accepte que des opérandes de type string.
• Dans ce cas, pour que l’instruction soit valide, il faut ajouter une autre définition de l’opérateur:
![Page 20: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/20.jpg)
INF1101 Algorithmes et structures de données 20
Implémentation de Implémentation de l’opérateur + de string l’opérateur + de string (suite)(suite)
class stringclass string{{ public:public:
// Constructeurs// Constructeurs
explicit string(char ch);explicit string(char ch);explicit string (const char* cstring=“”);explicit string (const char* cstring=“”);
~string() {delete [] buffer};~string() {delete [] buffer};
// Opérations// Opérations......string operator + (const string&) const;string operator + (const string&) const;
string operator + (const char* cstr) const;string operator + (const char* cstr) const; private:private:
int strLength;int strLength;
int bufferLength;int bufferLength;
char *buffer;char *buffer;......
![Page 21: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/21.jpg)
INF1101 Algorithmes et structures de données 21
Commutativité et Commutativité et fonctions globalesfonctions globales
• Ces derniers exemples de l’opérateur Ces derniers exemples de l’opérateur + prennent comme supposition que + prennent comme supposition que l’opérateur de gauche est un objet l’opérateur de gauche est un objet stringstring. .
• Cependant, ceci n’implique pas que Cependant, ceci n’implique pas que cet opérateur est commutatif cet opérateur est commutatif
![Page 22: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/22.jpg)
INF1101 Algorithmes et structures de données 22
Opérateur + non Opérateur + non commutatifcommutatif
string S1(“allo”), F2(“le monde”), F3;string S1(“allo”), F2(“le monde”), F3;
char* A = “tous”;char* A = “tous”;
S3 = S1 + A; // équivalent à S1.operator+(A);S3 = S1 + A; // équivalent à S1.operator+(A);
Cet exemple utilise la surcharge:Cet exemple utilise la surcharge:
string operator + (const char*) const;string operator + (const char*) const;
MaisMais
S3 = A + S1; S3 = A + S1; //équivalent à A.operator+(S1)???//équivalent à A.operator+(S1)???
![Page 23: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/23.jpg)
INF1101 Algorithmes et structures de données 23
Commutativité et fonctions globales (suite)
• Si l’on désire définir des opérateurs qui Si l’on désire définir des opérateurs qui accepte autre chose qu’un objet accepte autre chose qu’un objet stringstring à à gauche, et un objet gauche, et un objet stringstring à droite de à droite de l’opérateur, il faut se définir des l’opérateur, il faut se définir des fonctions fonctions globales globales pour permettre cette pour permettre cette commutativité.commutativité.
Exemple de surcharge globale de type Exemple de surcharge globale de type char + stringchar + string::string operator+(const char* A, const string& B);string operator+(const char* A, const string& B);
![Page 24: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/24.jpg)
INF1101 Algorithmes et structures de données 24
Commutativité et fonctions globales (suite)
RemarqueRemarque::
Si on définit l’opérateur + comme un opérateur Si on définit l’opérateur + comme un opérateur global, et qu’on exclut pas la conversion implicite global, et qu’on exclut pas la conversion implicite à partir d’un à partir d’un char* char* lors de l’appel du lors de l’appel du constructeurconstructeur,, on pourrait se contenter d’une on pourrait se contenter d’une seule définition:seule définition:
string operator+(const string& A, const string& B);string operator+(const string& A, const string& B);
![Page 25: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/25.jpg)
INF1101 Algorithmes et structures de données 25
Fonctions amiesProblème dans certains cas:
La fonction globale n’a pas le droit d’accéder au données privées de la classe
Solutions:• L’opérateur global accède aux données privées
par le bien de fonctions membres publiques (peut être inefficace dans certains cas)
• On déclare la fonction globale comme étant « amie »friend string operator +(char*, const string &);
![Page 26: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/26.jpg)
INF1101 Algorithmes et structures de données 26
Fonctions amies (suite)• Attention: les fonctions amies violent le principe
d’encapsulation. À moins de ne pouvoir faire autrement, il vaut mieux les éviter
• Dans le cas de la classe string, on peut l’éviter, en définissant une fonction globale qui prend en paramètre deux objets de type string:string operator+(const string&, const string&);
• Dans ce cas, il faut bien entendu que le constructeur accepte la conversion implicite
• Dans certains cas, on peut éviter de déclarer une fonction amie en n’utilisant que des fonctions membres de la classe pour accéder aux attributs de l’objet, si elles sont suffisantes pour la définition de l’opérateur
![Page 27: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/27.jpg)
INF1101 Algorithmes et structures de données 27
Surcharges d’opérateurs Surcharges d’opérateurs unairesunaires
• Opérateur ayant un seul paramètre.Opérateur ayant un seul paramètre.• L’unique argument est implicitement l’objet lui-L’unique argument est implicitement l’objet lui-
même.même.Rational& operator ++ (); Rational& operator ++ ();
Rational& Rational::operator ++ () Rational& Rational::operator ++ () {{
numer+=denom;numer+=denom;
return (*this);return (*this); Exemple dExemple d’utilisation:’utilisation:Rational F(2,3);Rational F(2,3);F++;F++;
}}
![Page 28: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/28.jpg)
INF1101 Algorithmes et structures de données 28
Surcharges de Surcharges de l’opérateur d’assignation l’opérateur d’assignation (=)(=)• Si l’opérateur = n’est pas surchargé, le Si l’opérateur = n’est pas surchargé, le
compilateur en génère un compilateur en génère un automatiquement. Cependant, l’assignation automatiquement. Cependant, l’assignation se fait attribut par attribut.se fait attribut par attribut.
• L’opérateur = par défaut peut causer de L’opérateur = par défaut peut causer de sérieux problèmes si l’objet contient des sérieux problèmes si l’objet contient des membres construits par allocation membres construits par allocation dynamique.dynamique.
![Page 29: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/29.jpg)
INF1101 Algorithmes et structures de données 29
Fonctions membres par Fonctions membres par défautdéfaut
Dans une classe, même si le programmeur Dans une classe, même si le programmeur ne les définit pas, il y a toujours:ne les définit pas, il y a toujours:
• Un Un constructeur par défautconstructeur par défaut s’il n’existe aucun s’il n’existe aucun autre constructeur.autre constructeur.
• Un Un constructeur de recopieconstructeur de recopie (attribut par attribut) (attribut par attribut)• La La surcharge de l’opérateur =surcharge de l’opérateur = par défaut( attribut par défaut( attribut
par attribut) est créée si une instruction fait par attribut) est créée si une instruction fait appel à cet opérateur.appel à cet opérateur.
• Un Un destructeur par défautdestructeur par défaut
![Page 30: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/30.jpg)
INF1101 Algorithmes et structures de données 30
Attention !Attention !Si votre classe a un attribut qui est un Si votre classe a un attribut qui est un pointeur et alloue de l’espace mémoire pointeur et alloue de l’espace mémoire dynamiquement, il faut absolument définir:dynamiquement, il faut absolument définir:
• Un constructeur de recopie;Un constructeur de recopie;• L’opérateur =;L’opérateur =;• Et un destructeur;Et un destructeur;
Et surtout ne pas utiliser les fonctions par défaut.Et surtout ne pas utiliser les fonctions par défaut.
![Page 31: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/31.jpg)
INF1101 Algorithmes et structures de données 31
Exemple de surcharge Exemple de surcharge d’opérateur d’opérateur = et de constructeur copie= et de constructeur copie
Dans la classe string, on a retiré leDans la classe string, on a retiré leconstructeur copie et la surcharge de l’opérateur =constructeur copie et la surcharge de l’opérateur =
class string{public:
string(char ch);string(const char*=“”);~string();. . .
private:char *buffer;int length;
};
![Page 32: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/32.jpg)
INF1101 Algorithmes et structures de données 32
Exemple de surcharge Exemple de surcharge d’opérateur =d’opérateur =
string a(“hola”),b; string a(“hola”),b;
b=a;b=a;
aabuffer
length=4;
h o l a 0
bbbuffer
length=4;
![Page 33: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/33.jpg)
INF1101 Algorithmes et structures de données 33
Exemple de surcharge Exemple de surcharge d’opérateur =d’opérateur =
string& string::operator=(const string &rhs){
if( this != &rhs) { if(bufferLength < rhs.length()+1) { delete []buffer; bufferLength=rhs.length()+1; buffer = new char[bufferLength]; } strLength=rhs.length(); strcpy(buffer,rhs.buffer); }
return *this;}
![Page 34: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/34.jpg)
INF1101 Algorithmes et structures de données 34
IV – Membre statiqueIV – Membre statique• Un attribut Un attribut static static n’existe qu’en une seule copie pour tous n’existe qu’en une seule copie pour tous
les objets d’une classe. les objets d’une classe.
• Un attribut Un attribut staticstatic est un espace commun à tous les objets est un espace commun à tous les objets instanciés. instanciés.
• L’espace mémoire d’une variable de classe existe même si L’espace mémoire d’une variable de classe existe même si aucun objet n’a été déclaré.aucun objet n’a été déclaré.
• Cette variable est accessible via les fonctions membres ou Cette variable est accessible via les fonctions membres ou par l’entremise de l’opérateur de résolution de portée :: .par l’entremise de l’opérateur de résolution de portée :: .
• L’initialisation d’une variable de classe ne se fait pas dans le L’initialisation d’une variable de classe ne se fait pas dans le constructeur…constructeur…
![Page 35: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/35.jpg)
INF1101 Algorithmes et structures de données 35
Fonction de classe staticFonction de classe static
• Une fonction de classe Une fonction de classe staticstatic ne peut ne peut accéder qu’aux membres accéder qu’aux membres staticstatic d’une d’une classe.classe.
• On peut appeler une fonction de classe On peut appeler une fonction de classe sans déclarer d’objet par l’opérateur de sans déclarer d’objet par l’opérateur de résolution de portée :: . résolution de portée :: .
• Les règles d’encapsulation demeurent les Les règles d’encapsulation demeurent les mêmes.mêmes.
![Page 36: INF1101 Algorithmes et structures de données1 Cours 2 Les classes et les objets (suite)](https://reader036.vdocuments.site/reader036/viewer/2022070309/551d9dc4497959293b8e1eac/html5/thumbnails/36.jpg)
INF1101 Algorithmes et structures de données 36
Variable de classe et Variable de classe et fonction de classe statiquesfonction de classe statiques
La classe Sphere possèdeLa classe Sphere possède la variable static nbSphere, qui conservela variable static nbSphere, qui conserve le nombre total de sphères créées dans le programme.le nombre total de sphères créées dans le programme.
class Sphere{class Sphere{public:public:
......static int getNbSphere() {return nbSphere;};static int getNbSphere() {return nbSphere;};......
public: public: ......static int nbSphere;static int nbSphere;......
};};
// Initialisation dans sphere.cpp// Initialisation dans sphere.cppint Sphere::nbSphere = 0;int Sphere::nbSphere = 0;
FonctionFonction de classede classe