web-dev-qa-db-fra.com

Pourquoi «ceci» est-il un pointeur et non une référence?

Je lisais les réponses à cette question avantages et inconvénients C++ et j'ai eu ce doute en lisant les commentaires.

les programmeurs trouvent souvent confus que "ceci" soit un pointeur mais pas une référence. une autre confusion est la raison pour laquelle "bonjour" n'est pas de type std :: string mais est évalué en un caractère const * (pointeur) (après la conversion du tableau en pointeur) - Johannes Schaub - litb 22 décembre 2008 à 1:56

Cela montre seulement qu'il n'utilise pas les mêmes conventions que les autres langages (ultérieurs). - le dorfier 22 déc.08 à 03:35

J'appellerais la chose "this" un problème assez trivial. Et oups, merci d'avoir attrapé quelques erreurs dans mes exemples de comportement indéfini. :) Bien que je ne comprenne pas quelles informations sur la taille ont à voir avec quoi que ce soit dans le premier. Un pointeur n'est tout simplement pas autorisé à pointer en dehors de la mémoire allouée - jalf 22 décembre 2008 à 4:18

Est-ce un poineur constant? - yesraaj 22 décembre 2008 à 6h35

cela peut être constant si la méthode est const int getFoo () const; <- dans le cadre de getFoo, "ceci" est constant et est donc en lecture seule. Cela évite les bogues et fournit un certain niveau de garantie à l'appelant que l'objet ne changera pas. - Doug T. 22 décembre 2008 à 16:42

vous ne pouvez pas réaffecter "ceci". c'est-à-dire que vous ne pouvez pas faire "this = & other;", car il s'agit d'une valeur r. mais c'est de type T *, pas de type T const. c'est-à-dire qu'il s'agit d'un pointeur non constant. si vous êtes dans une méthode const, c'est un pointeur vers const. T const. mais le pointeur lui-même n'est pas constant - Johannes Schaub - litb 22 décembre 2008 à 17:53

pensez à "ceci" comme ceci: # définissez ceci (this_ + 0) où le compilateur crée "this_" comme pointeur vers l'objet et fait de "this" un mot-clé. vous ne pouvez pas attribuer "this" car (this_ + 0) est une valeur r. bien sûr, ce n'est pas comme ça (il n'y a pas une telle macro), mais cela peut aider à le comprendre - Johannes Schaub - litb le 22 décembre 2008 à 17h55

Ma question est la suivante: pourquoi this est-il un pointeur et non une référence? Une raison particulière pour en faire un pointeur?


Quelques arguments supplémentaires expliquant pourquoi this étant une référence aurait un sens:

  • Considérer Item 1 de More Effective C++: utilisez des références lorsqu'il est garanti que nous avons un objet valide, c'est-à-dire pas un NULL (mon interprétation).
  • De plus, les références sont considérées comme plus sûres que les pointeurs (car nous ne pouvons pas visser la mémoire avec un pointeur parasite).
  • Troisièmement, la syntaxe d'accès aux références (.) est un peu plus agréable et plus court que l'accès aux pointeurs (-> ou (*)).
177
Naveen

Lorsque le langage a évolué pour la première fois, dans les premières versions avec de vrais utilisateurs, il n'y avait pas de références, seulement des pointeurs. Des références ont été ajoutées lorsque la surcharge d'opérateur a été ajoutée, car cela nécessite des références pour fonctionner de manière cohérente.

L'une des utilisations de this est qu'un objet obtienne un pointeur sur lui-même. S'il s'agissait d'une référence, il faudrait écrire &this. D'un autre côté, lorsque nous écrivons un opérateur d'affectation, nous devons return *this, qui aurait l'air plus simple comme return this. Donc, si vous aviez une ardoise vierge, vous pourriez en discuter dans les deux cas. Mais le C++ a évolué progressivement en réponse aux commentaires d'une communauté d'utilisateurs (comme la plupart des choses réussies). La valeur de la compatibilité descendante dépasse totalement les avantages/inconvénients mineurs résultant du fait que this est une référence ou un pointeur.

169
Daniel Earwicker

Un peu tard pour la fête ... Directement de la bouche du cheval, voici ce que Bjarne Stroustrup a à dire (qui est essentiellement répété ou extrait du livre "Design and Evolution of C++"):

Pourquoi "ceci" n'est-il pas une référence?

Parce que "this" a été introduit en C++ (vraiment en C avec Classes) avant l'ajout de références. De plus, j'ai choisi "ceci" pour suivre l'utilisation de Simula, plutôt que l'utilisation (plus tard) de Smalltalk de "soi".

113
Michael Burr