Les trois opérateurs distincts utilisés par C ++ pour accéder aux membres d'une classe ou d'un objet de classe, à savoir les deux points ::
, le point .
et la flèche ->
, sont utilisés pour trois scénarios différents qui sont toujours bien définis. Sachant cela vous permet de connaître immédiatement beaucoup de choses sur a
et b
juste en regardant a::b
, a.b
ou a->b
, respectivement, en tout code que vous regardez.
a::b
n'est utilisé que s'il b
est membre de la classe (ou de l'espace de noms) a
. Autrement dit, dans ce cas a
sera toujours le nom d'une classe (ou espace de noms).
a.b
n'est utilisé que s'il b
est membre de l'objet (ou référence à un objet) a
. Donc, pour a.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 des opérateurs d'accès membres qui peut être surchargé, donc s'il a
s'agit d'un objet d'une classe qui surcharge operator->
(les types courants sont les pointeurs intelligents et les itérateurs), la signification est celle que le concepteur de classe a implémentée. Pour conclure: Avec a->b
, si a
est un pointeur, b
sera un membre de l'objet auquel le pointeur a
fait référence. Si, cependant, a
est un objet d'une classe qui surcharge cet opérateur, alors la fonction d'opérateur surchargée operator->()
est invoquée.
Les petits caractères:
- En C ++, les types déclarés
class
, struct
ou union
sont considérés comme « de type de classe ». Donc, ce qui précède se réfère à tous les trois.
- Les références sont, sémantiquement, des alias d'objets, donc j'aurais dû ajouter "ou référence à un pointeur" au # 3 également. Cependant, j'ai pensé que ce serait plus déroutant qu'utile, car les références aux pointeurs (
T*&
) sont rarement utilisées.
- Les opérateurs point et flèche peuvent être utilisés pour faire référence aux membres de classe statiques d'un objet, même s'ils ne sont pas membres de l'objet. (Merci à Oli de l'avoir signalé!)
.
et->
peut également être utilisé pour accéder à la statique de classe via un objet, même s'ils ne sont pas strictement "membres de l'objet".operator*()
on peut également être surchargé, et que rien n'oblige cette surcharge à être cohérenteoperator->()
! (Je n'ai pas downvote BTW, je suis juste arrivé ici via une longue séquence de doublons)->
en surchargeantoperator*
et en utilisant.
. Seules lesoperator->
surcharges l'obtiennent.Proposer une alternative au point 3 de sbi
a->b
n'est utilisé que sia
est un pointeur. Il s'agit d'un raccourci pour(*a).b
, leb
membre de l'objet quia
pointe vers. C ++ possède deux types de pointeurs, les pointeurs «réguliers» et les pointeurs intelligents. Pour les pointeurs réguliers tels queA* a
le compilateur implémente->
. 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'écrit pas de pointeurs intelligents. Ils n'ont pas besoin de savoir que
->
c'est vraiment appeléoperator->()
, ou que c'est la seule méthode d'accès membre qui peut être surchargée.la source
+1
juste pour fournir une réponse alternative.->
est également surchargé pour les itérateurs standard que tout programmeur C ++ devrait bientôt rencontrer, donc dire qu'il n'est utilisé que pour les pointeurs pourrait être source de confusion.De l'exemple de codage ci-dessus, nous voyons que:
* Accès aux membres (attributs et fonctions) à partir d'une instance (ou objet) en utilisant l'opérateur point (
.
)* Accès aux membres (attributs et fonctions) à partir d'un pointeur vers un objet (ou créé par
new
) using the pointer operator (->
)* Accès aux fonctions membres statiques à partir de la classe elle-même sans avoir d'objet comme poignée à l'aide du double signe deux-points (
::
). [ Remarque: vous pouvez également appeler la fonction membre statique à partir d'une instance avec.
ou->
qui n'est pas recommandée]la source
->
ne peut être utilisé que par un pointeur alloué sur le tas parnew
? Ci-dessous, le deuxième élément, je pense que je précise vraiment que->
c'est pour le pointeur. Et avant de downvote, vous feriez mieux d'essayerclassName::non_static_member_function()
avec c ++ 14 par vous-même. La référence n'est pas un pointeur, elle peut donc être utilisée.
, et je le préciserai dans ma réponse.L'opérateur point est utilisé dans les scénarios de sélection directe des membres.
Ici, nous accédons
b
, qui est un membre direct d'un objeta
. Donc, principalement,a
est un objet etb
est un membre (fonction / variable, etc.) dea
.L'opérateur de flèche est utilisé dans les scénarios de sélection de membres indirects.
Ici, nous accédons à
b
un membre de l'objet, indiqué para
. Il est un raccourci(*a).b
et donc ici,a
est principalement un pointeur vers un objet etb
est un membre de cet objet.L'opérateur Double Colon (Scope) est utilisé dans les scénarios de sélection directe des membres liés à l' espace de noms.
Ici, nous accédons à
b
un membre de la classe / espace de nomsa
. Donc, principalement,a
est une classe / espace de noms etb
est un membre (fonction / variable, etc.) dea
.la source