logo

Pointeur 'this' en C++

Pour comprendre « ce » pointeur, il est important de savoir comment les objets considèrent les fonctions et les données membres d’une classe.

âge du dharmendra
  1. Chaque objet obtient sa propre copie du membre de données.
  2. Accédez à tous à la même définition de fonction que celle présente dans le segment de code.

Cela signifie que chaque objet obtient sa propre copie des données membres et que tous les objets partagent une seule copie des fonctions membres.
Alors maintenant, la question est la suivante : si une seule copie de chaque fonction membre existe et est utilisée par plusieurs objets, comment les données membres appropriées sont-elles accessibles et mises à jour ?
Le compilateur fournit un pointeur implicite ainsi que les noms des fonctions sous la forme « this ».
Le pointeur « this » est passé comme argument caché à tous les appels de fonctions membres non statiques et est disponible en tant que variable locale dans le corps de toutes les fonctions non statiques.Le pointeur 'this' n'est pas disponible dans les fonctions membres statiques car les fonctions membres statiques peuvent être appelées sans aucun objet (avec nom de classe).
Pour une classe X, le type de ce pointeur est 'X*'. De plus, si une fonction membre de X est déclarée comme const, alors le type de ce pointeur est « const X * » (voir ce GFact )



Dans la première version de C++, le pointeur « ce » pouvait être modifié ; ce faisant, un programmeur pourrait changer l'objet sur lequel une méthode travaillait. Cette fonctionnalité a finalement été supprimée, et c'est désormais une valeur r en C++.
C++ laisse les objets se détruire en appelant le code suivant :








delete> this>;>

>

>

Comme Stroustrup l'a dit, « ceci » pourrait être la référence plutôt que le pointeur, mais la référence n'était pas présente dans la première version de C++. Si « ceci » est alors implémenté comme référence, le problème ci-dessus pourrait être évité et il pourrait être plus sûr que le pointeur.

Voici les situations dans lesquelles le pointeur « this » est utilisé :

1) Lorsque le nom de la variable locale est le même que le nom du membre




#include> using> namespace> std;> > /* local variable is same as a member's name */> class> Test> {> private>:> >int> x;> public>:> >void> setX (>int> x)> >{> >// The 'this' pointer is used to retrieve the object's x> >// hidden by the local variable 'x'> >this>->x = x ;> >}> >void> print() { cout <<>'x = '> << x << endl; }> };> > int> main()> {> >Test obj;> >int> x = 20;> >obj.setX(x);> >obj.print();> >return> 0;> }>

>

>

Sortir:

 x = 20>

Pour les constructeurs, liste d'initialisation peut également être utilisé lorsque le nom du paramètre est identique au nom du membre.



2) Pour renvoyer la référence à l'objet appelant




/* Reference to the calling object can be returned */> Test& Test::func ()> {> >// Some processing> >return> *>this>;> }>

>

>

octets python dans la chaîne

Lorsqu'une référence à un objet local est renvoyée, la référence renvoyée peut être utilisée pour appels de fonction en chaîne sur un seul objet.




#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x ;>this>->oui = oui ; }> >Test &setX(>int> a) { x = a;>return> *>this>; }> >Test &setY(>int> b) { y = b;>return> *>this>; }> >void> print() { cout <<>'x = '> << x <<>' y = '> << y << endl; }> };> > int> main()> {> >Test obj1(5, 5);> > >// Chained function calls. All calls modify the same object> >// as the same object is returned by reference> >obj1.setX(10).setY(20);> > >obj1.print();> >return> 0;> }>

>

>

Sortir:

x = 10 y = 20>



Exercice:
Prédisez la sortie des programmes suivants. S'il y a des erreurs de compilation, corrigez-les.

question 1




#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> public>:> >Test(>int> x = 0) {>this>->x = x ; }> >void> change(Test *t) {>this> = t; }> >void> print() { cout <<>'x = '> << x << endl; }> };> > int> main()> {> >Test obj(5);> >Test *ptr =>new> Test (10);> >obj.change(ptr);> >obj.print();> >return> 0;> }>

>

>



question 2


liste sur Java



#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x ;>this>->oui = oui ; }> >static> void> fun1() { cout <<>'Inside fun1()'>; }> >static> void> fun2() { cout <<>'Inside fun2()'>;>this>->amusant1(); }> };> > int> main()> {> >Test obj;> >obj.fun2();> >return> 0;> }>

>

>



question 3




exemples de machine Moore

#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test (>int> x = 0,>int> y = 0) {>this>->x = x ;>this>->oui = oui ; }> >Test setX(>int> a) { x = a;>return> *>this>; }> >Test setY(>int> b) { y = b;>return> *>this>; }> >void> print() { cout <<>'x = '> << x <<>' y = '> << y << endl; }> };> > int> main()> {> >Test obj1;> >obj1.setX(10).setY(20);> >obj1.print();> >return> 0;> }>

>

>



Question 4




#include> using> namespace> std;> > class> Test> {> private>:> >int> x;> >int> y;> public>:> >Test(>int> x = 0,>int> y = 0) {>this>->x = x ;>this>->oui = oui ; }> >void> setX(>int> a) { x = a; }> >void> setY(>int> b) { y = b; }> >void> destroy() {>delete> this>; }> >void> print() { cout <<>'x = '> << x <<>' y = '> << y << endl; }> };> > int> main()> {> >Test obj;> >obj.destroy();> >obj.print();> >return> 0;> }>

>

>