202 votes

Pourquoi ' CE ' est un pointeur et non une référence ?

J'ai lu les réponses à cette question C++ pour et le contre et a obtenu ce doute en lisant les commentaires.

les programmeurs trouvent fréquemment source de confusion que "cela" est un pointeur, mais pas une référence. une autre confusion est pourquoi le "bonjour" n'est pas de type std::string, mais donne un char const* (pointeur) (d'après tableau de pointeur de conversion) – Johannes Schaub - litb Déc 22 '08 à 1:56

Qui montre seulement qu'il n'utilise pas les mêmes conventions que les autres (plus tard) des langues. – le dorfier Déc 22 '08 à 3:35

J'appellerais le "cette" chose une jolie question triviale. Et oups, merci pour la capture de quelques erreurs dans mes exemples de comportement indéfini. :) Bien que je ne comprends pas quelles sont les informations à propos de la taille a à voir avec quoi que ce soit dans la première. Un pointeur est tout simplement pas permis à point à l'extérieur de la mémoire allouée – jalf.com Déc 22 '08 à 4:18

Est-ce une constante poiner? – yesraaj Déc 22 '08 à 6:35

cela peut être constante si la méthode est const int getFoo() const; <- dans le champ d'application de getFoo, "ce" est constante, et est donc en lecture seule. Cela empêche les bugs et assure un certain niveau de garantie à l'appelant que l'objet ne change pas. – Doug T. Dec 22 '08 à 16:42

vous ne pouvez pas réaffecter "ce". j'.e vous ne pouvez pas le faire "ce = &autres;", parce que c'est une rvalue. mais cela est de type T*, pas de type T const . j'.e c'est un non-pointeur constant. si vous êtes dans un const méthode, puis c'est un pointeur const. T const . mais le pointeur lui-même est nonconst – Johannes Schaub - litb Déc 22 '08 à 17:53

pensez à "ce", comme ceci: #define ce (this_ + 0) où le compilateur crée "this_" comme un pointeur vers l'objet et le rend "ce" d'un mot clé. vous ne pouvez pas affecter de "ce" parce que (this_ + 0) est une rvalue. bien sûr, ce n'est pas la façon dont il est (il n'y a pas une telle macro), mais il peut aider à la comprendre – Johannes Schaub - litb Déc 22 '08 à 17:55

Ma question est, pourquoi this est un pointeur pas une référence? Une raison en particulier pour ce qui en fait un pointeur?

196voto

Daniel Earwicker Points 63298

Lorsque la langue a d'abord été en évolution, dans les versions anciennes avec de vrais utilisateurs, il n'y avait pas de références, seuls les pointeurs. Les références ont été ajoutés lors de la surcharge d'opérateur a été ajouté, car il nécessite des références à fonctionner régulièrement.

L'une des utilisations de l' this est un objet pour obtenir un pointeur vers lui-même. Si c'était une référence, il faudrait l'écrire &this. D'autre part, lorsque nous écrivons un opérateur d'affectation, nous devons return *this,, qui aurait l'air plus simple que return this. Donc si vous avait une ardoise vierge, on pourrait dire ça de toute façon. Mais le C++ progressivement évolué en réponse à la rétroaction à partir d'une communauté d'utilisateurs (comme la plupart des succès de choses). La valeur de compatibilité ascendante totalement accable le mineur avantages/inconvénients découlant de l' this être une référence ou un pointeur.

127voto

Michael Burr Points 181287

Un peu en retard à la fête... Directement de la bouche des chevaux, voici ce que Stroupstrup a à dire (ce qui est essentiellement répété dans ou à partir de la "Conception et l'Évolution de C++" livre):

Pourquoi "ce" n'est pas une référence?

Parce que "ce" a été introduit en C++ (vraiment en C avec des Classes) avant les références ont été ajoutées. Aussi, j'ai choisi "ce" à suivre Simula d'utilisation, plutôt que de la (plus tard) Smalltalk l'utilisation de "auto".

-3voto

Ayush Goyal Points 537

La norme C++ états qui

9.3.2/1

Dans le corps d'un non statiques (9.3) fonction membre, le mot-clé this est un non lvalue expression dont la valeur est l'adresse de l'objet pour lequel la fonction est appelée. Le type de ceci dans une fonction membre d'une classe X est X*. Si la fonction de membre est déclarée const, le type de ce qui est const X*, si la fonction de membre est déclaré volatile, le type de ce qui est volatile X*, et, si le membre la fonction est déclarée const volatile, le type de ce qui est const volatile X*.

Mais dans d'autres références , il a été constaté quelque chose d'autre.. si quelqu'un a pris l'initiative et a tiré un mail à M. Stroustrup. La conversation qui a suivi peut être trouvé ici.

-4voto

Richard Corden Points 12292

Peu importe comment nous sommes arrivés ici, je pense qu’il est chanceux que ce est un pointeur et non une référence car cela aide à « faire sens » que vous pouvez supprimer il :

Je pense qu’il s’agit d’un cas où, sans être nécessairement par sa conception, C++ est préférable, car il est.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X