2017-08-15 3 views
-1

Ich versuche zu lernen, Überladung in C++ überladen.C++ - Operator Überladen der ist gleich Operator

Ich habe ein Tutorial verfolgt und den '==' Operator überladen, um Objekte einer Klasse zwischen ihnen vergleichen zu können. Wie folgt aus:

bool Vector2::operator==(const Vector2& v) const 
{ 
    return ((x_==v.GetX()) && (y_==v.GetY())); 
} 

Meine Klasse hat zwei Vars drin (x_ und y_). Ich habe zwei Objekte aus dieser Klasse erstellt, einige Werte angegeben und verglichen und es hat gut funktioniert. Aber dann habe ich den Operator == verwendet, um mit ganzen Zahlen zu vergleichen, und es hat auch gut funktioniert. Jetzt habe ich erwartet, dass der Operator == nicht mit ganzen Zahlen arbeitet, weil ich ihn gerade überladen habe, um etwas anderes zu tun. Aber trotzdem. Ich bin jetzt ein wenig verwirrt. Und ich habe diese Frage:

Wie kommt der Operator == nach Überlastung wie diese kann noch verwendet werden, um Integer/Floats/Doubles/etc zu vergleichen? In meinem Fall, wenn es ein Vector2-Klassenobjekt als zweiten Parameter sieht, verhält es sich wie in der überladenen Version und wenn es etwas anderes sieht, verhält es sich normal?

Auch eine andere Frage: Ich habe eine class classA und eine class classB beide mit 2 Variablen in ihnen und nur in Namen unterschiedlich. Ich erstelle zwei Objekte für classA objA und eins für classB objB und ich gebe einige Werte mit einem Standardkonstruktor.

Jetzt ist es möglich, die operator == zu überlasten, um eine Komparation wie if(objA==objB) zu machen? Oder müssen die Operanden im Ausdruck vom selben Typ sein? Entweder classA oder classB?

Bitte helfen Sie mir, dies zu klären. Danke fürs Lesen!

+0

welcher Art ist 'x_' und' y_'? – Malice

+0

Sie sollten weitere Quellinformationen hinzufügen. –

+2

Sie haben '== 'für' Vector2' definiert, nicht für 'int'. Überladen ist _by definition_ eine Implementierung für _different_ types/arguments. Andere Implementierungen sind davon nicht betroffen. Wenn du jedoch *** '==' für 'int' umdefinieren würdest, wäre das eine andere Geschichte. –

Antwort

1

Wenn Ihr Vector2 Klasse einen Konstruktor hat, der eine int nimmt und das ist nicht explicit markiert, ermöglicht es ganze Zahlen implizit Vector2 umgewandelt werden, wie in diesem Beispiel gezeigt:

#include <iostream> 
#include <assert.h> 

struct S 
{ 
    S(int x) : x(x) {} 

    bool operator==(const S& other) const 
    { 
     return x == other.x; 
    } 
    int x; 
}; 

int main() { 
    S s1{5}; 
    S s2{5}; 

    assert(s1 == s2); 

    assert(!(s1 == 5)); 

    return 0; 
} 

Ideone

Diese Code kompiliert, aber die zweite Assertion schlägt fehl, weil 5 in eine S konvertiert wird.