Quand dois-je utiliser un point, une flèche, une ou deux points de référence aux membres d'une classe en C++?
Venant d'autres C-langages dérivés (comme Java ou C#) pour C++, il est au premier abord très déroutant que le C++ a trois façons de faire référence aux membres d'une classe: a::b
, a.b
, et a->b
. Quand dois-je utiliser une de ces opérateurs?
(Note: Ceci est destiné à être une entrée à Un Débordement de pile du C++ FAQ. Si vous voulez une critique de l'idée de fournir une FAQ dans le présent formulaire, puis l'affichage sur des méta qui a commencé toute cette serait l'endroit pour le faire. Les réponses à cette question sont surveillés dans le C++ tchat, où la FAQ idée a commencé à en premier lieu, de sorte que votre réponse est très probablement le faire lire par ceux qui sont venus avec l'idée.)
OriginalL'auteur sbi | 2011-02-13
Vous devez vous connecter pour publier un commentaire.
Les trois différents opérateurs C++ utilise pour accéder aux membres d'une classe ou d'une classe d'objet, à savoir le double du côlon
::
, le point.
, et la flèche->
, sont utilisés pour les trois scénarios différents qui sont toujours bien définies. Sachant cela, vous pouvez immédiatement savoir beaucoup de choses sura
etb
juste en regardanta::b
,a.b
, oua->b
, respectivement, dans le code que vous regardez.a::b
n'est utilisé que sib
est un membre de la classe (ou de l'espace)a
. C'est, dans ce casa
sera toujours le nom d'une classe (ou de l'espace).a.b
n'est utilisé que sib
est un membre de l'objet (ou la référence à un objet)a
. Donc, poura.b
,a
sera toujours un objet réel (ou une référence à un objet) d'une classe.a->b
est, à l'origine, une notation abrégée pour(*a).b
. Cependant,->
est le seul de l'accès du membre opérateurs peuvent être surchargés, donc sia
est un objet d'une classe qui surchargesoperator->
(commune ces types sont des pointeurs intelligents et les itérateurs), le sens est celui que le concepteur de classes mises en œuvre. Pour conclure: Aveca->b
, sia
est un pointeur,b
sera un membre de l'objet le pointeura
se réfère. Si, toutefois,a
est un objet d'une classe qui surcharges de cet opérateur, l'opérateur surchargé la fonctionoperator->()
est appelé.Les petits caractères:
class
,struct
, ouunion
sont considérés comme "de type de classe". Ci-dessus se réfère à tous les trois d'entre eux.T*&
) sont rarement utilisés..
et->
peut également être utilisé pour accéder à la classe statique par l'intermédiaire d'un objet, même si elles ne sont pas strictement "les membres de l'objet".C'est en effet vrai. Je l'ai ajouté à lire les petits caractères, car je pense qu'il n'est pas commun, et suffisamment important pour être répertorié dans le texte principal.
Pour être complet, il peut être intéressant de souligner que
operator*()
peut également être surchargé, et que rien n'oblige que la surcharge pour être cohérent avecoperator->()
! (Je n'ai pas downvote BTW, viens ici par une longue séquence de doublons)sauriez-vous où est spécifié dans la norme C++?
Vous ne pouvez pas obtenir le comportement de chaînage de
->
par la surchargeoperator*
et à l'aide de.
, cependant. Seulementoperator->
surcharges.OriginalL'auteur sbi
ce qui Suggère une alternative pour sbi point 3
a->b
n'est utilisé que sia
est un pointeur. C'est un raccourci pour(*a).b
, leb
membre de l'objet quea
points. C++ a deux types de pointeurs, "ordinaire" et des pointeurs intelligents. Régulièrement des pointeurs commeA* a
, le compilateur met en œuvre->
. Pour les pointeurs intelligents tels questd::shared_ptr<A> a
,->
est une fonction membre de la classeshared_ptr
.Justification: le public cible de cette FAQ n'est pas écrit des pointeurs intelligents. Ils n'ont pas besoin de savoir
->
est vraiment appeléoperator->()
, ou qu'il est le seul membre de la méthode d'accès qui peut être surchargée.+1
juste pour fournir une alternative la réponse.Eh bien, pour être juste
->
est aussi surchargé pour norme des itérateurs qui tout programmeur C++ devrait rencontrer prochainement, donc dire que c'est seulement utilisée pour les pointeurs pourrait être source de confusion.Les programmeurs C++" n'a pas besoin d'être rédaction pointeur intelligent ou itérateur types, tout en les utilisant. "Déréférence comme un pointeur" s'applique à la fois.
OriginalL'auteur MSalters