les classes les structures en c (struct) regroupent des variables : structuration de l'analyse...
TRANSCRIPT
![Page 1: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/1.jpg)
Les Classes
les structures en C (struct)
regroupent des variables : structuration de l'analyse
mais
• problèmes de cohérence
• problèmes de sécurité d'accès
• problèmes de syntaxe d'utilisation
![Page 2: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/2.jpg)
limitation des structures
cohérence
exemple : taille utile de tableaustruct s_tablo{
long tab[100];long util;
};
taille gérée "à la main" dans le programme
![Page 3: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/3.jpg)
limitation des structures
or : information a priori en lecture seule
taille mise à jour en fonction des opérations effectuées.
on peut tout de même faire :
struct s_tablo t_tab;
t_tab.util = 142; ne correspond à aucune opération
valeur invalide car > 100
![Page 4: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/4.jpg)
limitation des structures
problème de syntaxe :
opérateurs et fonctions standard non applicables
écrire des fonctions spécifiques à cette structure mais fonctions non distinguables a priori
![Page 5: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/5.jpg)
Sécurisation des accès
dans une classe C++ :
les membres de la classe ont une accessibilité :
public ou private (par défaut)
les struct du C ont tous leurs champs public.
![Page 6: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/6.jpg)
Intégration des fonctions
distinction champ/membre
dans une classe C++ : les fonctions font partie de la classe : fonctions membres
classe : champs+fonctions = membres de la classe
tout membre a une accessibilité
![Page 7: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/7.jpg)
Utilisation des membres
• les membres public peuvent être utilisés dans du code hors de la classe
• les membres private ne peuvent être utilisés que dans du code à l'intérieur de la classe
contrôle de ce qui peut être programmé
![Page 8: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/8.jpg)
Rédiger une classeclass ma_classe{
public : // membres publicprivate : // membres private
};
int main(){
ma_classe var;
// instructions}
exemple avec Dev
![Page 9: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/9.jpg)
Appel de fonction membre
accès à un membre comme pour les struct
. pour accéder à un membre d'une variable de la classe
-> pour accéder à un membre via un pointeur
exemple avec Dev
![Page 10: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/10.jpg)
Appel de fonction membre
avantage : simplification des appels, plus de fonctions spécifiques n'importe où dans le code
fonction associée à l'objet qui l'appelle
référencé dans la fonction : this
![Page 11: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/11.jpg)
Fonctions spéciales
Éviter les variables non initialiséesen C : pas de contrôle
en C++ : fonction spéciale à ce rôle pour les classes
le constructeur
porte le nom de la classe associée
![Page 12: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/12.jpg)
Fonctions spéciales
appelé automatiquement à la définition de la variable.en général, accessibilité public
class x{
public :x() {//code à effectuer}// autres membres public
private : // membres private};
exemple avec Dev
![Page 13: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/13.jpg)
Fonctions spéciales
rôle : initialiser les membres de classe
pas besoin de fonction init() à appeler de manière explicite
possibilité de :• paramètres• paramètres par défaut• surcharge (plusieurs constructeurs)
![Page 14: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/14.jpg)
Fonctions spéciales
appel de constructeur avec paramètres
classe objet(paramètres);
exemple :class x{
public : int j;x(int i){j=i};
};
dans main() : x toto(4);
![Page 15: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/15.jpg)
Fonctions spéciales
un exemple avec un programme
la classe Complexe
avec plusieurs constructeurs
c'est parti !
![Page 16: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/16.jpg)
Membres de type pointeur
création de variable : constructeur
gestion des membres de type : pointeur
retour sur le tableau avec taille utile
constructeur avec paramètre pour taille utile :
réaliser une allocation dynamique
![Page 17: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/17.jpg)
Membres de type pointeurclass tablo{
private : long util;double *valeurs;
public :tablo(long nb) // constructeur{
util=nb;
if (util<=0){
util = 0;valeurs = null;
}else{
valeurs = new double[util];}
}
// autres fonctions membres}
![Page 18: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/18.jpg)
Membres de type pointeurclass tablo{
public :
…
void afficher(){ for(long cpt=0; cpt < util; cpt++) {
cout << "valeurs[" << cpt << "] = " << valeurs[cpt] << endl; }
return;}
}
le tableau dynamique est toujours bien initialisé (tester le résultat de new)
![Page 19: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/19.jpg)
Membres de type pointeur
libérer l'espace alloué ?
quand ?
de quelle manière ?
lorsque l'objet est détruit
par l'appel automatique à une fonction membre : le destructeur
![Page 20: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/20.jpg)
Destructeur
porte le nom de la classe précédé de ~
• pas de type de retour
• pas d'arguments
• pas de surcharge
![Page 21: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/21.jpg)
Destructeur
exemples :
classe complexe :~complexe(){} // car rien à faire
classe tablo :~tablo(){
if (valeurs != null){
delete[] valeurs;}
}
![Page 22: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/22.jpg)
new/delete
utilisés pour créer des tableaux d'objets
new : alloue de la mémoireappelle le constructeur
delete : appelle le destructeurlibère la mémoire allouée
exemple avec Dev
![Page 23: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/23.jpg)
Copie d'objets
opération fréquente toujours implicite :
passage de paramètres,
création d'un objet à partir d'un autre
classe objet1;
classe objet2(objet1); // OK
classe objet2 = objet1;
il ne s'agit pas d'une affectation !
![Page 24: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/24.jpg)
Copie d'objets
risquée si un membre est un pointeur !
écrire un constructeur par recopie, le rendre explicite
classe(const classe& paramètre);
passage de const & ?
![Page 25: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/25.jpg)
Copie d'objets
évite le partage de contenu
systématique lorsque la classe a un membre de type pointeur.
![Page 26: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/26.jpg)
Rédaction de classe
partie interface
partie implémentation (code)
séparation en .h / .cpp
prototype et définitions de membres
code des fonctions membres
![Page 27: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/27.jpg)
Rédaction de classe
dans le fichier .cpp, le nom de la fonction membre inclue la classe à laquelle elle appartient[type] classe::fonction(paramètres){
code;[return;]
}
:: résolution de portée
exemple avec Dev
![Page 28: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/28.jpg)
Surcharge des opérateurs
force du C++ : modifier la syntaxe
définir les opérateurs standard pour la classe
opérateur = fonction
syntaxe cohérente
<< et >> toujours surchargés (ou presque)
![Page 29: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/29.jpg)
Surcharge des opérateurs
opérateurs surchargeables :
arithmétiques : + - * / ++ -- %
logiques : && || < <= > >= == !=
autres : [] = << >> -> new delete
![Page 30: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/30.jpg)
Surcharge des opérateurs
surcharge des E/S : << et >>
pas des fonctions membres !
pourtant, doivent accéder aux membres private.
déclarées comme fonctions amies
friend
![Page 31: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/31.jpg)
Surcharge des opérateursclass point2d // pour des graphiques en 2D{ private :
double x,y; public :
point2d(double=0.0, double=0.0);~point2d();point2d(const point2d&);
friend ostream& operator<<(ostream &, const point2d&);};
code de la fonction :ostream& operator<<(ostream &os, const point2d &p){
os << "(" << p.x << "," << p.y << ")";return os;
}
![Page 32: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/32.jpg)
Surcharge des opérateursclass point2d // pour des graphiques en 2D{ private :
double x,y; public :
point2d(double=0.0, double=0.0);~point2d();point2d(const point2d&);
friend istream& operator>>(istream &, point2d&);// pas de const point2d& !!!
};
code de la fonction :istream& operator>>(ostream &is, point2d &p){
is >> p.x >> p.y;return is;
}exemple avec Dev
![Page 33: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/33.jpg)
les nombres complexes
redéfinir les opérateurs arithmétiques
les nombres complexes
en faire une classe se comportant comme un type de base
les opérateurs arithmétiques ont un sens pour cette classe
![Page 34: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/34.jpg)
les nombres complexes
2 possibilités
complex operator+(const complex&);
friend complex operator+(const complexe &, const complexe &);
fonction membre
fonction amie
![Page 35: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/35.jpg)
les nombres complexes
différence ?complex z1, z2;
cout << z1+z2;
+ fonction membre :
z1.operator+(z2);
+ fonction amie :operator+(z1,z2);
et l'opérateur << ?
![Page 36: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/36.jpg)
les nombres complexes
En fait :
cout << z1+z2;
operator<<(cout,z1.operator+(z2));
ou
operator<<(cout,operator+(z1,z2));
il n'y a que des appels de fonctions !
![Page 37: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/37.jpg)
les nombres complexes
choix d'une fonction amie
fonction membre : l'opérande de gauche doit être de la classe dont l'operator est membre :pas de conversion possible.
fonction amie : les deux opérandes sont symétriques
![Page 38: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/38.jpg)
les opérateurs surchargés
implémentation d'un opérateur
complex operator+(const complex &z1, const complex &z2){
return complex(z1.re+z2.re,z1.im+z2.im);}
exemple avec Dev
![Page 39: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/39.jpg)
l'opérateur =
presqu'identique au constructeur par recopie
nécessaire lorsque l'on traite des pointeurs
mais bug très vicieux
le cas de l'auto affectation !
![Page 40: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/40.jpg)
l'opérateur =class toto{// du code ici};
class w{ private :
toto *p; // pointe sur un objet de classe toto
public : // constructeurs, destructeur, surcharges classiques
w& operator=(const w& source){
if (values){
delete p;}
p = new toto(*(source.p)); // aie aie aie….
return *this;}
}
![Page 41: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/41.jpg)
l'opérateur =
tester si this est égal à &source !
if (this==&source) return *this;
![Page 42: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/42.jpg)
Objets temporaires
créés dans des expressions, durée de vie très brève
![Page 43: Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès](https://reader036.vdocuments.mx/reader036/viewer/2022070309/551d9da5497959293b8d6a05/html5/thumbnails/43.jpg)
Conclusion
Écriture de classes robustes
• sécurité d'accès
• facilité d'utilisation
• initialisation garantie