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/29 13:57]
bmonsuez
in204:cpp:syntax:class [2022/11/18 10:50] (current)
Line 1: Line 1:
-====== ​Déclaration ​d'une classe ​======+====== ​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 17: Line 19:
  
  
-====== Les membres d'une classe =====+===== Les membres d'une classe =====
  
 Les éléments membres d'une classe peuvent être : Les éléments membres d'une classe peuvent être :
Line 25: Line 27:
   * 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.   * 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.   * 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 définitions de types. Ces définitions de type sont propres à 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 valeurs constantes. Ces définitions de valeurs constantes ​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.   * 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.
  
-===== Accéder ​aux champs et fonctions membres ​d'un objet =====+===== Accès ​aux éléments ​d'un objet =====
  
-Les fonctions membres ​accèdents directement aux éléments définis au sein de l'​objet ​sans avoir besoin ​de préfixer ceux-ci soit par une référence à l'​objet, ​soit par le nom du type de l'​objet.+Nous faisons la distinction entre les éléments qui sont propres à un objet instance d'une classe. Ces éléments sont : 
 + 
 +  * les champs de l'​objet,​ 
 +  * les fonctions membres de l'​objet
 + 
 +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. 
 + 
 +Et les autres composantes de l'​objet ​qui sont communes à tous les instances d'une classes que sont : 
 + 
 +  * les champs et fonctions membres dites statiques, 
 +  * les définitions des types ou des alias de type, 
 + 
 + 
 + 
 +==== Accès aux fonctions membres et aux champs propres à l'​objet ​instance d'une classe =====
  
 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 : 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 :
Line 67: Line 84:
 </​code>​ </​code>​
  
-Pour accéder ​aux définitions de types présentes ​dans l'​objets,​ nous accédons+==== Accès ​aux autres éléments définis ​dans la classe =====
  
-===== Différence entre ''​class'' ​et ''​struct''​ =====+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 ''​::''​.
  
-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 si nous considérons ​la classe ​des nombres complexes ​:
- +
-Ainsi, écrire ​:+
  
 <code cpp> <code cpp>
- +class Complex 
-struct A  +
-{      +
-    unsigned field; ​                // définition des champs. +
-    bool test(); ​                    // prototype des fonctions membres  +
-}; +
- +
-</​code>​ +
- +
-est équivalent à : +
- +
-<code cpp> +
- +
-class  +
-   +
 public: 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>​
  
-Par analogie,  +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 B  +Complex complexNumber(polar, 2.0, 0,52);
-{     +
-    unsigned value                 // définition des champs. +
-    bool execute(int);               // prototype des fonctions membres  +
-}; +
 </​code>​ </​code>​
- +est parfaitement valide, même si habituellement,​ nous écrirons plutôt ​:
-est équivalent à : +
 <code cpp> <code cpp>
 +Complex complexNumber(Complex::​Polar(),​ 2.0, 0,52);
 +</​code>​
 +et nous nous affranchirons ainsi de la valeur intermédiaire ''​polar''​.
  
-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 164: 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 216: 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.1569765451.txt.gz · Last modified: 2019/09/29 13:57 by bmonsuez