Pourquoi "ceci" est-il un pointeur et non une référence?
Question
Je lisais les réponses à cette question Les avantages et les inconvénients de C ++ et ai eu ce doute en lisant les commentaires.
Lesprogrammeurs trouvent souvent déroutant que & "; ce &"; est 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 est évalué à un caractère const * (pointeur) (après la conversion de tableau en pointeur) & # 8211; Johannes Schaub - lundi 22 décembre 2008 à 01h56
Cela montre seulement qu'il n'utilise pas les mêmes conventions que les autres langues (ultérieures). & # 8211; le dorfier 22 déc. 08 à 3:35
J'appellerais le & "this &"; chose un problème assez trivial cependant. Et oups, merci d'avoir relevé 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 & # 8211; jalf 22 décembre 2008 à 4:18
Est-ce un poiner constant? & # 8211; yesraaj 22 décembre 2008 à 6:35
cela peut être constant si la méthode est const int getFoo () const; < - dans le cadre de getFoo, & "this &"; est constant et est donc en lecture seule. Cela évite les bugs et offre à l'appelant une certaine garantie que l'objet ne changera pas. & # 8211; Doug T. 22 décembre 2008 à 16h42
vous ne pouvez pas réaffecter & "ce &" ;. c'est-à-dire que vous ne pouvez pas faire & «this = & et autres; &» ;, car il s'agit d'une valeur réelle. mais c'est du type T *, pas du 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 sur const. T const. mais le pointeur lui-même est nonconst & # 8211; Johannes Schaub - lundi 22 décembre 2008 à 17h53
pense à & "ce &"; comme ceci: #define this (this_ + 0) où le compilateur crée & "this _ &"; en tant que pointeur sur l'objet et crée & "this &"; un mot clé. vous ne pouvez pas affecter & "; ce &"; car (this_ + 0) est une valeur réelle. Bien sûr, ce n’est pas comme cela (il n’existe pas de macro), mais cela peut aider à la comprendre & # 8211; Johannes Schaub - lundi 22 décembre 2008 à 17h55
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 arguments supplémentaires pour expliquer pourquoi Item 1
être une référence aurait un sens:
- Considérez
More Effective C++
à partir de.
: utilisez des références quand il est garanti que nous avons un objet valide, c'est-à-dire pas un NULL (mon interprétation). - En outre, 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 simple et plus courte que l'accès aux pointeurs ((*)
ou <=>).
La solution
Lorsque la langue 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, mais uniquement des pointeurs. Des références ont été ajoutées lors de l'ajout de la surcharge d'opérateurs, car les références doivent 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, nous devions écrire &this
. Par contre, lorsque nous écrivons un opérateur d’affectation, nous devons return *this
, ce qui nous paraîtrait plus simple que return this
. Donc, si vous avez une ardoise vierge, vous pouvez argumenter d'une manière ou d'une autre. Mais C ++ a évolué progressivement en réponse aux commentaires d'une communauté d'utilisateurs (comme la plupart des choses qui ont réussi). La valeur de la compatibilité ascendante dépasse totalement les avantages / inconvénients mineurs liés au fait que <=> est une référence ou un pointeur.
Autres conseils
Un peu tard pour la fête ... voici ce que Bjarne Stroustrup a publié à dire (qui est essentiellement repris dans le livre & "Design et évolution du C ++ &";):
Pourquoi & "ce &"; pas une référence?
Parce que & "this &" a été introduit en C ++ (vraiment en C avec les classes) avant l’ajout des références. De plus, j'ai choisi & "Ce &"; suivre l'utilisation de Simula, plutôt que l'utilisation (plus tardive) par Smalltalk de & "soi &";
La norme C ++ stipule que
9.3.2 / 1
Dans le corps d'un non statique (9.3) fonction membre, le mot clé est un expression non-lvalue dont la valeur est l'adresse de l'objet pour lequel la fonction s'appelle. Le type de cela dans une fonction membre d'une classe X est X *. Si la fonction membre est déclaré const, le type de ceci est const X *, si la fonction membre est déclarée volatile, le type de ceci est X * volatile, et si le membre la fonction est déclarée constante volatile, le type de ceci est const volatile X *.
Mais dans d'autres références, il a été trouvé quelque chose d'autre .. alors quelqu'un a pris l'initiative et a envoyé un courrier à Mr. Stroustrup . La conversation qui a suivi peut être trouvée ici .