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.

  Les

programmeurs 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 <=>).
Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top