Operatorüberladung

8

Warum ist überladener Operator = eine Memberfunktion ($ 13.5.3), aber kein Compound-Zuweisungsoperator, z. Operator + = ($ 13.5.2)? Übersehe ich hier etwas?

    
Chubsdad 16.11.2010, 09:17
quelle

4 Antworten

4

Eine Kopierzuweisung operator= wird als Mitglied immer vom Compiler bereitgestellt, wenn der Benutzer keinen definiert. Ich glaube, dass es nur der Einfachheit halber und um unerwartete Mehrdeutigkeiten zu vermeiden, dass es eine Anforderung gemacht wurde, dass operator= nicht als eine freie Funktion definiert werden kann.

Konvertierungsoperatoren kümmern sich um den Fall, wenn Sie einen benutzerdefinierten Typ einem integrierten Typ zuweisen möchten.

    
Charles Bailey 16.11.2010 09:27
quelle
2

Die Abschnitte, auf die Sie verweisen, haben zum Ausblenden der Basisklassenimplementierungen von operator=

zu sagen
  

Weil ein Kopierzuweisungsoperator operator= implizit für eine Klasse deklariert ist, wenn sie nicht vom Benutzer deklariert wurde (12.8),

Dies kann auch die Antwort auf Ihre Frage sein, da der Compiler wissen muss, ob er ein operator= erzeugen soll, muss er wissen, ob ein solcher Operator definiert wurde, wenn er außerhalb der Klasse definiert werden könnte wissen, ob es in einer anderen Übersetzungseinheit definiert wurde.

z.B.

%Vor%

Zusammengesetzte Operatoren andererseits sind nicht implizit definiert, daher gibt es keinen Grund, sie zu zwingen, als Mitgliedsfunktionen deklariert zu werden.

    
Motti 16.11.2010 09:26
quelle
1

Neben dem Standard- und dem Kopierkonstruktor wird auch operator = speziell in C ++ behandelt. Das heißt, auch wenn Sie keinen deklarieren, wird der Compiler eine Standardimplementierung für Sie bereitstellen. Aber Standardimplementierungen sind nicht immer das Verhalten, das den Anforderungen Ihrer Klasse entspricht. Deshalb sollten Sie sie explizit deklarieren (oder sie verbergen, indem Sie private Sichtbarkeit zuweisen).

Und warum ist der Standardkonstruktor, der Kopierkonstruktor und der Zuweisungsoperator so besonders? Weil sie an der Standardvariableninitialisierung und der Parameterübergabe beteiligt sind: Wenn Sie einen klassenbasierten Parameter als Wert (nicht als Verweis oder Zeiger) an eine Funktion übergeben, werden diese Operationen aufgerufen, um den Inhalt in den Stapel zu kopieren.

    
buc 16.11.2010 09:28
quelle
1

Wie von Charles angegeben, wird immer eine Kopierzuweisung operator= vom Compiler bereitgestellt, wenn der Benutzer keinen definiert. Diese vom Compiler bereitgestellte Member-Funktion hätte immer Vorrang vor einer Nicht-Member-Funktion. Selbst wenn sie als Nicht-Member-Funktion definieren könnte, würde sie nicht aufgerufen.

    
icecrime 16.11.2010 09:38
quelle

Tags und Links