Wenn ich einen Zeiger auf ein Objekt, das einen überladenen Index-Operator hat ([]
) warum kann ich nicht tun:Index-Operator auf Zeiger
MyClass *a = new MyClass();
a[1];
aber haben diese stattdessen tun:
MyClass *a = new MyClass();
(*a)[1];
Wenn ich einen Zeiger auf ein Objekt, das einen überladenen Index-Operator hat ([]
) warum kann ich nicht tun:Index-Operator auf Zeiger
MyClass *a = new MyClass();
a[1];
aber haben diese stattdessen tun:
MyClass *a = new MyClass();
(*a)[1];
Es ist weil Sie Operatoren für einen Zeigertyp nicht überladen können; Sie können einen Operator nur überladen, wenn mindestens einer der Parameter (Operanden) Klassen- oder Aufzählungstyp ist.
Wenn Sie also einen Zeiger auf ein Objekt eines bestimmten Klassentyps haben, der den Subscript-Operator überlädt, müssen Sie diesen Zeiger dereferenzieren, um seinen überladenen Subscript-Operator aufzurufen. In Ihrem Beispiel hat a
den Typ MyClass*
; Dies ist ein Zeigertyp, so dass das eingebaute operator[]
für Zeiger verwendet wird. Wenn Sie den Zeiger dereferenzieren und eine MyClass
erhalten, haben Sie ein Objekt vom Typ class, so dass das überladene operator[]
verwendet wird.
Wie '->' und '.' werden unterschieden. – earlNameless
Einfach ausgedrückt, mit a[1]
der Zeiger a
wird als Speicher mit Array behandelt, und Sie versuchen, auf das zweite Element im Array zugreifen (die nicht vorhanden ist).
Die (*a)[1]
Kräfte, um zuerst das tatsächliche Objekt an der Zeigerposition, (*a)
, und rufen Sie dann den Operator []
darauf.
Da a
ist Typ Zeiger auf eine MyClass und nicht eine MyClass. Das Ändern der Sprache, um Ihre gewünschte Verwendung zu unterstützen, würde viele andere Sprach-Semantiken brechen lassen.
struct foo {
int a[10];
int& operator [](int i) { return a[i]; }
};
main() {
foo *a = new foo();
foo &b = *a;
b[2] = 3;
}
Gute Nachrichten:
Sie können die syntaktischen Ergebnis Sie wollen bekommen. Sie können auch ...
a-> operator [] (1);
Um die bevorzugte Antwort hinzuzufügen, denken Sie an Überlastung des Operators als Überlastungsfunktionen.
Wenn Sie die Memberfunktion einer Klasse überladen, erinnern Sie sich, dass der Zeiger nicht von diesem Klassentyp ist.
Sie könnten auch 'a [0] [1]' ;-) – fredoverflow