This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
in204:cpp:syntax:class [2019/09/29 15:28] bmonsuez [Accès aux éléments d'un objet] |
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 26: | Line 28: | ||
* 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 [[in204:cpp:syntax:class:type|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 [[in204:cpp:syntax:class:const_value|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ès aux éléments d'un objet ===== | + | ===== Accès aux éléments d'un objet ===== |
Nous faisons la distinction entre les éléments qui sont propres à un objet instance d'une classe. Ces éléments sont : | Nous faisons la distinction entre les éléments qui sont propres à un objet instance d'une classe. Ces éléments sont : | ||
Line 38: | Line 39: | ||
A l'exception | A l'exception | ||
* des champs et fonctions membres dites [[in204:cpp:syntax:class:static|statiques]]. | * 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 syntax particulière. | + | * 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 : | Et les autres composantes de l'objet qui sont communes à tous les instances d'une classes que sont : | ||
Line 44: | Line 45: | ||
* les champs et fonctions membres dites statiques, | * les champs et fonctions membres dites statiques, | ||
* les définitions des types ou des alias de type, | * les définitions des types ou des alias de type, | ||
- | * les définitions de valeurs constantes. | ||
- | ===== Accès aux fonctions membres et aux champs ===== | + | ==== Accès aux fonctions membres et aux champs propres à l'objet instance d'une classe ===== |
- | + | ||
- | 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. | + | |
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 86: | Line 84: | ||
</code> | </code> | ||
- | ===== Accès aux autres éléments définis dans la classe ===== | + | ==== 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 ''::''. | 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 ''::''. | ||
- | Ainsi si nous considérons | + | Ainsi si nous considérons la classe des nombres complexes : |
- | + | ||
- | ===== 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> | <code cpp> | ||
- | + | class Complex | |
- | struct A | + | { |
- | { | + | |
- | unsigned field; // définition des champs. | + | |
- | bool test(); // prototype des fonctions membres | + | |
- | }; | + | |
- | + | ||
- | </code> | + | |
- | + | ||
- | est équivalent à : | + | |
- | + | ||
- | <code cpp> | + | |
- | + | ||
- | class A | + | |
- | { | + | |
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 187: | 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 239: | 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> | ||