c++ operators




Warum kannst du das "." Operator in C++? (3)

Es ist sehr einfach zu verstehen, wenn Sie den internen Mechanismus des Aufrufs der Operatorfunktion durchlaufen, sagen Sie, ein Klassenkomplex kann zwei Elemente für den reellen Teil und für den imaginären Teil haben. Sage Complex C1 (10,20), C2 (10,2) // wir nehmen an, dass innerhalb der Klasse bereits ein Konstruktor mit zwei Argumenten existiert. Wenn Sie jetzt C1 + C2 als Anweisung schreiben, dann versuchen Sie den Compiler, die überladene Version des Operators + für die komplexe Zahl zu finden. Nun gehen wir davon aus, dass ich + Operator überladen habe, also C1 + C2 intern übersetzt als c1.operator + (c2) Nimm nun für die Zeit Wesen an, die du überladen kannst '.' Operator. so denke jetzt folgenden Aufruf C1.disp () // Inhalt eines komplexen Objekts anzeigen Jetzt versuchen, als interne Darstellung C1.operator darzustellen. (------) , völlig chaotisch Dinge erstellt. Das ist der Grund, warum wir nicht "überladen" können. Operator

Es wäre sehr nützlich, die. Operator in C ++ und gibt einen Verweis auf ein Objekt zurück.

Sie können operator-> und operator* überladen, aber nicht den operator.

Gibt es einen technischen Grund dafür?


Sehen Sie dieses Zitat von Bjarne Stroustrup :

Operator . (Punkt) könnte im Prinzip mit der gleichen Technik wie für -> überladen werden. Dies kann jedoch zu Fragen darüber führen, ob eine Operation für die Objektüberladung gedacht ist. oder ein Objekt, auf das verwiesen wird. Beispielsweise:

class Y {
public:
    void f();
    // ...
};

class X {    // assume that you can overload .
    Y* p;
    Y& operator.() { return *p; }
    void f();
    // ...
};

void g(X& x)
{
    x.f();    // X::f or Y::f or error?
}

Dieses Problem kann auf verschiedene Arten gelöst werden. Zum Zeitpunkt der Standardisierung war nicht klar, welcher Weg am besten wäre. Weitere Informationen finden Sie unter Design und Entwicklung von C ++ .


Stroustrup sagte, dass C ++ eine erweiterbare, aber nicht änderbare Sprache sein sollte.

Der Operator dot (attribute access) wurde als zu nah am Kern der Sprache angesehen, um eine Überladung zu ermöglichen.

Siehe das Design und die Entwicklung von C ++ , Seite 242, Abschnitt 11.5.2 Smart References .

Als ich mich entschieden habe, das Überladen des Bedieners zu erlauben -> , habe ich natürlich überlegt, ob Betreiber . könnte ähnlich überladen werden.

Zu der Zeit betrachtete ich die folgenden Argumente als schlüssig: Wenn obj ein Klassenobjekt ist, dann hat obj.m eine Bedeutung für jedes Mitglied m der Klasse dieses Objekts. Wir versuchen, die Sprache nicht veränderlich zu machen, indem wir eingebaute Operationen neu definieren (obwohl diese Regel für = aus unerfreulichem Bedürfnis und für unäres & ) verletzt wird.

Wenn wir die Überladung zulassen . für eine Klasse X wären wir nicht in der Lage, auf Mitglieder von X mit normalen Mitteln zuzugreifen; wir müssten einen Zeiger verwenden und -> , aber -> und & könnte auch neu definiert worden sein. Ich wollte eine erweiterbare Sprache, keine veränderbare.

Diese Argumente sind gewichtig, aber nicht schlüssig. Insbesondere schlug Jim Adcock 1990 vor, eine Überlastung des Betreibers zuzulassen . genau so wie operator -> ist.

Das "Ich" in diesem Zitat ist Bjarne Stroustrup. Sie können nicht autoritärer sein als das.

Wenn Sie C ++ wirklich verstehen wollen (wie in "Warum ist es so?"), Sollten Sie unbedingt dieses Buch lesen.





operator-overloading