Je lisais les réponses à cette question pour et contre C ++ et j'ai eu ce doute en lisant les commentaires.
les programmeurs trouvent souvent déroutant que «ceci» soit un pointeur mais pas une référence. une autre confusion est la raison pour laquelle "hello" n'est pas de type std :: string mais s'évalue en un char const * (pointeur) (après la conversion d'un tableau en pointeur) - Johannes Schaub - litb 22 décembre 08 à 1:56
Cela montre seulement qu'il n'utilise pas les mêmes conventions que les autres langages (plus récents). - le dorfier 22 décembre 08 à 3:35
J'appellerais la chose "ceci" une question assez triviale cependant. Et oups, merci d'avoir détecté quelques erreurs dans mes exemples de comportement indéfini. :) Bien que je ne comprenne pas ce que les 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 08 à 4:18
Est-ce un pointeur constant? - yesraaj 22 décembre 08 à 6:35
cela peut être constant si la méthode est const int getFoo () const; <- dans la portée de getFoo, "this" est constant, et 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.Décembre 22 08 à 16:42
vous ne pouvez pas réaffecter «ceci». c'est-à-dire que vous ne pouvez pas faire "this = & other;", car c'est une rvalue. mais celui-ci est de type T *, pas de type T const. c'est-à-dire que c'est un pointeur non constant. si vous êtes dans une méthode const, alors c'est un pointeur vers const. T const. mais le pointeur lui-même est nonconst - Johannes Schaub - litb 22 décembre 08 à 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 rvalue. bien sûr, ce n'est pas comme ça (il n'y a pas de telle macro), mais cela peut aider à le comprendre - Johannes Schaub - litb 22 décembre 08 à 17:55
Ma question est la suivante: pourquoi this
un pointeur n'est-il pas une référence? Une raison particulière pour en faire un pointeur?
Quelques autres arguments pour lesquels this
être une référence aurait du sens:
- Considérez à
Item 1
partir deMore Effective C++
: utilisez des références quand il est garanti que nous avons un objet valide ie 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 errant).
- Troisièmement, la syntaxe pour accéder aux références (
.
) est un peu plus agréable et plus courte que pour accéder aux pointeurs (->
ou(*)
).
this
toujourstrue
?_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
Réponses:
Lors de la première évolution du langage, 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érateurs a été ajoutée, car elle nécessite des références pour fonctionner de manière cohérente.
L'une des utilisations de
this
est pour un objet d'obtenir un pointeur sur lui-même. Si c'était une référence, il faudrait écrire&this
. D'un autre côté, lorsque nous écrivons un opérateur d'affectation, nous devons le fairereturn *this
, ce qui semblerait plus simple quereturn this
. Donc, si vous aviez une ardoise vierge, vous pourriez argumenter dans les deux sens. Mais le C ++ a évolué progressivement en réponse aux commentaires d'une communauté d'utilisateurs (comme les choses les plus réussies). La valeur de la compatibilité ascendante dépasse totalement les avantages / inconvénients mineurs découlant duthis
fait d' être une référence ou un pointeur.la source
operator &
pour faire quelque chose d'utile. Il faudrait une syntaxe spéciale pour obtenir l'adresse de ce qui ne passerait pasoperator &
.int n = 5; int &r = n; int *p = &r; std::cout << *p;
&reinterpret_cast<char&>(this);
pour obtenir la véritable adresse de surchargeoperator&
(en fait, c'est en quelque sorte ce queboost::addressof
fait).this
d'être nul, il me semble qu'une référence est vraiment plus appropriée.Un peu tard à la fête ... Tout droit sorti de la bouche du cheval, voici ce que Bjarne Stroustrup a à dire (qui est essentiellement repris ou tiré du livre "Design and Evolution of C ++"):
la source