Die drei unterschiedlichen Operatoren, mit denen C ++ auf die Elemente einer Klasse oder eines Klassenobjekts zugreift, nämlich der Doppelpunkt ::
, der Punkt .
und der Pfeil ->
, werden für drei verschiedene Szenarien verwendet, die immer genau definiert sind. Mit diesem Wissen können Sie sofort wissen sehr viel über a
und b
nur durch einen Blick auf a::b
, a.b
oder a->b
jeweils in jedem Code , den Sie betrachten.
a::b
wird nur verwendet, wenn b
es sich um ein Mitglied der Klasse (oder des Namespace) handelt a
. Das heißt, in diesem Fall a
ist immer der Name einer Klasse (oder eines Namespace).
a.b
wird nur verwendet, wenn b
es sich um ein Mitglied des Objekts handelt (oder auf ein Objekt verweist) a
. Also für a.b
, a
eine Klasse wird immer ein tatsächliches Objekt (auf ein Objekt oder eine Referenz) sein.
a->b
ist ursprünglich eine Kurzschreibweise für (*a).b
. Es ->
ist jedoch der einzige der Mitgliedszugriffsoperatoren, der überladen werden kann. Wenn a
also ein Objekt einer Klasse überladen ist operator->
(häufig sind solche Typen intelligente Zeiger und Iteratoren), ist die Bedeutung unabhängig von der Implementierung des Klassen-Designers. Fazit: Mit a->b
, wenn a
es sich um einen Zeiger handelt, b
wird ein Mitglied des Objekts sein, auf das sich der Zeiger a
bezieht. Wenn es sich jedoch a
um ein Objekt einer Klasse handelt, die diesen Operator überlastet, wird die überladene Operatorfunktion operator->()
aufgerufen.
Das Kleingedruckte:
- In C ++ deklarierten Typen wie
class
, struct
oder union
sind „der Klassentyp“ betrachtet. Das Obige bezieht sich also auf alle drei.
- Verweise sind semantisch Aliase für Objekte, daher hätte ich auch # 3 "oder einen Verweis auf einen Zeiger" hinzufügen sollen. Ich dachte jedoch, dass dies eher verwirrend als hilfreich wäre, da Verweise auf pointers (
T*&
) selten verwendet werden.
- Die Punkt- und Pfeiloperatoren können verwendet werden, um auf statische Klassenmitglieder eines Objekts zu verweisen, obwohl sie keine Mitglieder des Objekts sind. (Danke an Oli für den Hinweis!)
.
und->
kann auch verwendet werden, um über ein Objekt auf Klassenstatik zuzugreifen, obwohl sie nicht ausschließlich "Mitglieder des Objekts" sind.operator*()
dies auch überlastet werden kann und dass nichts diese Überlastung zwingt, damit übereinzustimmenoperator->()
! (Ich habe BTW nicht abgelehnt, bin nur über eine lange Folge von Duplikaten->
durch Überladenoperator*
und Verwenden erreichen.
. Das bekommen nuroperator->
Überladungen.Vorschlag einer Alternative für sbi Punkt 3
a->b
wird nur verwendet, wenna
es sich um einen Zeiger handelt. Es ist eine Abkürzung für(*a).b
dasb
Mitglied des Objekts, auf dasa
verwiesen wird. C ++ hat zwei Arten von Zeigern, "reguläre" und intelligente Zeiger. Für reguläre Zeiger wie z. B.A* a
implementiert der Compiler->
. Für intelligente Zeiger wiestd::shared_ptr<A> a
,->
ist eine Elementfunktion der Klasseshared_ptr
.Begründung: Die Zielgruppe dieser FAQ schreibt keine intelligenten Zeiger. Sie müssen nicht wissen , dass es
->
wirklich aufgerufenoperator->()
wird oder dass es die einzige Zugriffsmethode für Mitglieder ist, die überladen werden kann.quelle
+1
nur, um eine alternative Antwort zu geben.->
ist es auch für Standard-Iteratoren überlastet, die jeder C ++ - Programmierer bald treffen sollte. Es könnte also verwirrend sein, zu sagen, dass es nur für Zeiger verwendet wird.Aus dem obigen Codierungsbeispiel geht
Folgendes hervor : * Zugriff auf Elemente (Attribute und Funktionen) von einer Instanz (oder einem Objekt) mit dem Punktoperator (
.
)* Zugriff auf Elemente (Attribute und Funktionen) von einem Zeiger auf ein Objekt (oder erstellt von
new
) Verwenden des Zeigeroperators (->
)* Zugriff auf statische Elementfunktionen von der Klasse selbst aus, ohne ein Objekt als Handle mit dem Doppelpunkt (
::
) zu haben. [ Hinweis: Sie können auch die statische Elementfunktion von einer Instanz aufrufen mit.
oder->
die wird nicht empfohlen]quelle
->
kann nur von einem Zeiger verwendet werden, der auf dem Heap von zugeordnet istnew
? Im Folgenden, dem zweiten Punkt, denke ich, mache ich wirklich deutlich, dass->
es sich um einen Zeiger handelt. Und bevor Sie abstimmen, sollten Sie es besser selbstclassName::non_static_member_function()
mit c ++ 14 versuchen . Referenz ist kein Zeiger, daher kann sie verwendet werden.
, und ich werde dies in meiner Antwort klarer machen.Der Punktoperator wird in Szenarien mit direkter Elementauswahl verwendet.
Hier greifen wir zu
b
, was ein direktes Mitglied eines Objekts ista
. Also ist in erster Liniea
ein Objekt undb
ein Mitglied (Funktion / Variable usw.) vona
.Der Pfeiloperator wird in indirekten Elementauswahlszenarien verwendet.
Hier greifen wir darauf zu,
b
welches Mitglied des Objekts ist, auf das von gezeigt wirda
. Es ist eine Abkürzung von(*a).b
und ist hier ina
erster Linie ein Zeiger auf ein Objekt undb
ein Mitglied dieses Objekts.Der Doppelpunkt-Operator (Scope) wird in Namespace-bezogenen Szenarien für die direkte Auswahl von Mitgliedern verwendet.
Hier greifen wir darauf zu,
b
welches Mitglied der Klasse / des Namespace ist.a
Also ist es in erster Liniea
eine Klasse / ein Namespace undb
ein Mitglied (Funktion / Variable usw.) vona
.quelle