User Tools

Site Tools


in204:cpp:syntax:class

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
in204:cpp:syntax:class [2019/09/16 13:35]
147.250.35.104 [Méthode ''const'' & objets modifiables]
in204:cpp:syntax:class [2022/11/18 10:50] (current)
Line 1: Line 1:
-====== ​Introduction à la déclaration des classes ======+====== ​Les classes ​en C++ ====== 
 + 
 +===== La déclaration d'une classe ​=====
  
 Une classe définissant un objet est défini comme une [[in204:​cpp:​syntax:​struct|structure]] contenant en plus des champs de la structure des fonctions membres. Une classe définissant un objet est défini comme une [[in204:​cpp:​syntax:​struct|structure]] contenant en plus des champs de la structure des fonctions membres.
Line 16: Line 18:
 </​code>​ </​code>​
  
-===== Définition des fonctions membres ===== 
  
-La définition de la fonction peut contenir soit l'entête de la fonction membre suivi de son code :+===== Les membres d'une classe =====
  
-<code cpp>+Les éléments membres d'une classe peuvent être :
  
-#include <​cmath>​+  * des champs à l'​instar des ''​struct''​ en C. Ces champs ont un type qui peut-être soit un type simple, soit un type structuré, tableau ou objet. Ces définitions de champs définissent les valeurs internes à l'​objet. 
 +  * des [[in204:​cpp:​syntax:​class::​functions|fonctions membres]], il s'agit de fonctions qui peuvent accédées et modifiées les valeurs internes de l'​objet. Elles peuvent aussi appelées d'​autres fonctions internes à l'​objet. 
 +  * des [[in204:​cpp:​syntax:​class::​constructor|constructeurs]] qui sont des fonctions membres particulières qui initialisent l'​objet au moment de la création de l'​objet. 
 +  * d'un [[in204:​cpp:​syntax:​class::​destructor|destructeur]] qui est une fonction membre particulière qui est appleé au moment de la destruction de l'​objet. 
 +  * des [[in204:​cpp:​syntax:​class:​type|définitions de types]]. Ces définitions de type sont propres à l'​objet. 
 +  * des définitions de fonctions membres et de champs statiques qui sont partagées par tous les objets étant instance de la même classe.
  
-struct Vector +===== Accès aux éléments d'un objet =====
-{      +
-    double x; +
-    double y;+
  
-    double norm()  +Nous faisons la distinction entre les éléments qui sont propres à un objet instance d'une classe. Ces éléments sont :
-    {  +
-        return sqrt(x*x + y*y); +
-    } +
-}+
  
-</​code>​+  * les champs de l'​objet,​ 
 +  * les fonctions membres de l'​objet,​
  
-soit nous pouvons scinder la déclaration de la fonction membre en définissant ​au sein de la classe le prototype de la fonction membre. Le code de la fonction membre sera défini en dehors ​de la classe.+A l'​exception  
 +  * des champs et fonctions membres dites [[in204:​cpp:​syntax:​class:​static|statiques]]. 
 +  * des constructeurs et des destructeurs d'un objet qui normalement ne sont pas directement invoquées mais indirectement ​au moment ​de la construction ou de la destruction d'un objet et selon une syntaxe particulière.
  
-<code cpp>+Et les autres composantes de l'​objet qui sont communes à tous les instances d'une classes que sont :
  
-#include <​cmath>​+  * les champs et fonctions membres dites statiques,​ 
 +  * les définitions des types ou des alias de type,
  
-struct Vector 
-{      
-    double x; 
-    double y; 
  
-    double norm(); 
-} 
  
-double Vector::​norm()  +==== Accès aux fonctions membres et aux champs propres à l'​objet instance d'une classe =====
-{  +
-    return sqrt(x*x + y*y); +
-}+
  
-</​code>​ +Pour pouvoir accéder ​aux champs et aux fonctions membres d'un objet à l'​exception des champs et membres statiques de l'​objet,​ nous utilisons :
- +
- +
-Dans ce cas, il est possible de mettre la définition du code de la fonction dans un fichier ''"​.h"''​ ou ''"​.hpp"''​ +
- +
-<code cpp> +
-// Fichier Vector.hpp +
-#ifndef VectorHPP +
-#define VectorHPP +
- +
-#include <​cmath>​ +
- +
-struct Vector +
-{      +
-    double x; +
-    double y; +
- +
-    double norm(); +
-}; +
-#endif +
-</​code>​ +
- +
-et le code de la fonction membre dans le fichier ''"​.cc"''​ ou ''"​.cpp"'':​ +
- +
-<code cpp> +
-// Fichier Vector.cpp +
- +
-#include "​Vector.hpp"​ +
- +
-double Vector::​norm()  +
-{  +
-    return sqrt(x*x + y*y); +
-+
- +
-</​code>​ +
- +
-===== Accéder ​aux champs et fonctions membres d'un objet ===== +
- +
-Pour accéder aux champs et aux fonctions d'un objet, nous utilisons :+
  
   * soit l'​opérateur ''​.'', ​   * soit l'​opérateur ''​.'', ​
Line 128: Line 84:
 </​code>​ </​code>​
  
 +==== Accès aux autres éléments définis dans la classe =====
  
 +Pour accéder aux définitions de types présentes dans l'​objets,​ nous référençons ces éléments en préfixant le nom de l'​élément référencé par le nom de la classe suivit de ''::''​.
  
-===== Différence entre ''​class''​ et ''​struct''​ ===== +Ainsi si nous considérons ​la classe ​des nombres complexes ​:
- +
-En fait, les classes peuvent être définies soit en utilisant le mot-clé ''​struct''​ soit en utilisant le mot-clé ''​class''​. Si on utilise le mot clé ''​struct'',​ cela signifie que par défaut les champs et fonctions membres (que l'on appelle aussi méthodes) sont visibles de tous ([[in204:​cpp:​syntax:​public|public]]) tandis qu'ils ne sont visibles que des fonctions membres de la classe ​si on utilise le mot clé ''​class''​. +
- +
-Ainsi, écrire ​:+
  
 <code cpp> <code cpp>
- +class Complex 
-struct A  +{  
-    ​ +public: 
-    ​unsigned field                ​// définition des champs+  
-    ​bool test();                     // prototype des fonctions membres ​+   class Polar {}; // Classe vide ne servant qu'à définir un  
 +                   // type additionnel pour identifier  
 +                   // une conversion polaire vers complexe. 
 +private: 
 +    ​double re; 
 +    double im; 
 +  
 +public: 
 +    Complex(): re(0.0), im(0.0) ​        // Constructeur par défaut
 +    ​{} 
 +    Complex(const Complex&​ theSource):  ​// Constructeur de recopie 
 +        re(theSource.re),​ im(theSource.im) 
 +    {} 
 +    Complex(double aFloat): ​            // Conversion 
 +        re(aFloat), im(0.0) 
 +    {} 
 +    Complex(double theReal, double theImaginary) 
 +        re(theReal),​ im(theImaginary) ​  // Constructeur spécialisé 
 +    {} 
 +    Complex(Polar,​ double theRho, double thePhi) 
 +        re(theRho* cos(thePhi)),​ im(theRho* sin(thePhi)) 
 +    {}
 }; };
- 
 </​code>​ </​code>​
  
-est équivalent ​à : +Il est possible d'​accéder ​à la classe ''​Polar''​ de ''​Complex''​ en préfixant ''​Polar''​ par ''​Complex::​Polar''​. Ainsi l'​appel ​:
 <code cpp> <code cpp>
- +Complex::Polar polar
-class A  +Complex complexNumber(polar, 2.0, 0,52);
-{     +
-public: +
-    unsigned field                // définition des champs. +
-    bool test();                     // prototype des fonctions membres  +
-}; +
 </​code>​ </​code>​
- +est parfaitement validemême si habituellement,​ nous écrirons plutôt :
-Par analogie +
 <code cpp> <code cpp>
- +Complex complexNumber(Complex::​Polar(), 2.0, 0,52);
-class B  +
-{     +
-    unsigned value; ​                 // définition des champs. +
-    bool execute(int);               // prototype des fonctions membres  +
-}; +
 </​code>​ </​code>​
 +et nous nous affranchirons ainsi de la valeur intermédiaire ''​polar''​.
  
-est équivalent à : 
- 
-<code cpp> 
- 
-struct B  
-{    ​ 
-private: 
-    unsigned value; ​                 // définition des champs. 
-    bool execute(int); ​              // prototype des fonctions membres ​ 
-}; 
- 
-</​code>​ 
  
-===== Sections ''​private'',​ ''​protected''​ et ''​public''​ =====+==== Sections ''​private'',​ ''​protected''​ et ''​public''​ =====
  
 Les mots clés ''​private'',​ ''​protected''​ et ''​public''​ modifient la visibilité des différents éléments dans une classe. Pour plus d'​informations,​ le chapitre détaille les différents niveaux [[in204:​cpp:​syntax:​public|d'​accessibilité aux champs et membres]] notamment dans le cadre de l'​héritage. Les mots clés ''​private'',​ ''​protected''​ et ''​public''​ modifient la visibilité des différents éléments dans une classe. Pour plus d'​informations,​ le chapitre détaille les différents niveaux [[in204:​cpp:​syntax:​public|d'​accessibilité aux champs et membres]] notamment dans le cadre de l'​héritage.
Line 225: Line 173:
 </​code>​ </​code>​
  
-===== Méthode ​''​const''​ & objets modifiables ​ =====+===== Fonction membres ​''​const''​ & objets modifiables ​ =====
  
 La classe ''​Point''​ précédemment définie introduit deux fonctions membres qui ne font que lire le contenu des champs ''​x''​ et ''​y''​ de l'​objet. Ces méthodes ne modifiant par l'​objet,​ il peut-être ajouter le qualificateur [[in204:​cpp:​syntax:​const|''​const''​]] à ces deux méthodes. La classe ''​Point''​ précédemment définie introduit deux fonctions membres qui ne font que lire le contenu des champs ''​x''​ et ''​y''​ de l'​objet. Ces méthodes ne modifiant par l'​objet,​ il peut-être ajouter le qualificateur [[in204:​cpp:​syntax:​const|''​const''​]] à ces deux méthodes.
Line 277: Line 225:
 </​code>​ </​code>​
  
 +===== Le pointeur this ======
  
 +Dans une fonction membre, le mot clé ''​this''​ désigne le pointeur faisant référence à l'​instance de l'​objet qui est à l'​origine de l'​appel de la méthode.
 +
 +Disposer de la référence sur l'​objet dans la méthode est principalement pour les usages suivant :
 +
 +   * lever l'​ambiguité sur un conflit entre des noms de fonctions ou de champs, notamment quand il y a une fonction ou un champ qui est défini plusieurs fois dans des contextes différents,​ cela permet de préciser que l'on souhaite accéder au champ ou à la méthode défini dans la classe en préfixant le nom du membre ou de la méthode par ''​this->''​.\\ <code cpp>
 +bool Value::​is_equal(const A& anotherValue) const
 +{
 +    return this->​m_value == anotherObject.m_value;​
 +}
 +</​code>​
 +
 +   * permettre à la fonction de retourner une référence à l'​objet,​ soit sous la forme d'un pointeur, soit au contraire sous la forme d'une référence.\\ <code cpp>
 +Value& Value::​operator+=(const A& anotherValue)
 +{
 +    this->​m_value += anotherValue.m_value;​
 +    return *this;
 +}
 +</​code>​
 +   * peremttre de dupliquer l'​objet en appelant un constructeur qui attend une référence à l'​objet ou de passer la référence de l'​objet à une fonction qui attendrait une telle référence.\\ <code cpp>
 +Value& Value::​operator++(int)
 +{
 +    Value value(*this);​
 +    this->​m_value ++;
 +    return value;
 +}
 +</​code>​
 +
 +===== Différence entre ''​class''​ et ''​struct''​ =====
 +
 +En fait, les classes peuvent être définies soit en utilisant le mot-clé ''​struct''​ soit en utilisant le mot-clé ''​class''​. Si on utilise le mot clé ''​struct'',​ cela signifie que par défaut les champs et fonctions membres (que l'on appelle aussi méthodes) sont visibles de tous ([[in204:​cpp:​syntax:​public|public]]) tandis qu'ils ne sont visibles que des fonctions membres de la classe si on utilise le mot clé ''​class''​.
 +
 +Ainsi, écrire :
 +
 +<code cpp>
 +
 +struct A 
 +{     
 +    unsigned field; ​                // définition des champs.
 +    bool test(); ​                    // prototype des fonctions membres ​
 +};
 +
 +</​code>​
 +
 +est équivalent à :
 +
 +<code cpp>
 +
 +class A 
 +{    ​
 +public:
 +    unsigned field; ​                // définition des champs.
 +    bool test(); ​                    // prototype des fonctions membres ​
 +};
 +
 +</​code>​
 +
 +Par analogie, ​
 +
 +<code cpp>
 +
 +class B 
 +{    ​
 +    unsigned value; ​                 // définition des champs.
 +    bool execute(int); ​              // prototype des fonctions membres ​
 +};
 +
 +</​code>​
 +
 +est équivalent à :
 +
 +<code cpp>
 +
 +struct B 
 +{    ​
 +private:
 +    unsigned value; ​                 // définition des champs.
 +    bool execute(int); ​              // prototype des fonctions membres ​
 +};
 +
 +</​code>​
  
  
in204/cpp/syntax/class.1568640901.txt.gz · Last modified: 2019/09/16 13:35 by 147.250.35.104