Frage

Hallo ich einen Code wie diese haben, denke ich, sowohl der Freund überladenen Operator und Konvertierungsoperator die eine ähnliche Funktion haben. Doch warum ist der Freund überladene Operator in diesem Fall genannt? Was ist die Regeln?

Vielen Dank!

class A{

    double i;
public:
    A(int i):i(i) {}
    operator double () const { cout<<"conversion operator"<<endl;return i;}                            // a conversion operator
    friend bool operator>(int i, A  a);                            // a friend funcion of operator >
};

bool operator>(int i, A  a ){
    cout<<"Friend"<<endl;
    return i>a.i;
}
int main()
{
    A  aa(1);
     if (0 > aa){
         return 1;
      }
}
War es hilfreich?

Lösung

Keine Konvertierung ist erforderlich, dass der überladene operator> aufgerufen werden. Damit die eingebauten in operator> genannt zu werden, ist eine Umwandlung notwendig ist (der benutzerdefinierte Konvertierungsoperator. Die Überladungsauflösung vorzieht Optionen mit weniger erforderlichen Umwandlungen, so der überladene operator> verwendet wird.

Beachten Sie, dass, wenn Sie sind die Definition Ihres überladenen operator> ändern zum Beispiel zu sein,:

friend bool operator>(double i, A  a);

würden Sie einen Kompilierungsfehler, weil sowohl der überladene operator> und die eingebauten in operator> würde eine Umwandlung erforderlich ist, und der Compiler nicht in der Lage sein, die Mehrdeutigkeit aufzulösen.

Andere Tipps

Ich bin nicht behaupten, dass meine Antwort durch die Standards unterstützt, aber logisch darüber läßt denken.

Wenn Sie schlagen diese Zeile:

0 > aa

Sie haben zwei Möglichkeiten. Entweder Sie den mitgelieferten Betreiber anrufen:

friend bool operator>(int i, A  a);

Welche ist 100% kompatibel, oder Sie können zwei Conversions tun, um Ihr Ziel zu erreichen! Welches würden Sie wählen?

Wenn Sie einen Konvertierungsoperator dann fügen Sie ein Objekt vom Typ A umgewandelt werden kann, zu verdoppeln, wenn man es am wenigsten erwartet.

Ein gutes Programm bietet keine Möglichkeit für seine Klassen accidently verwendet werden und die Umwandlung Betreiber eröffnet die opertunity für die Klasse in einer ganzen Reihe von unbeabsichtigten Situationen verwendet wird (in der Regel Situationen, in denen Sie einen Kompilierung Fehler erwarten ist nicht wegen der Umwandlung von Autotyp).

Als Ergebnis Konvertierungsoperator (und einziges Argument Konstrukteurs) sollen wegen Situationen mit einiger Sorgfalt treateed werden sollten die Compiler Umwandlung tun können, wenn Sie es am wenigsten erwarten.

Es heißt, weil es sich um eine genaue Übereinstimmung ist im Rahmen des Ausdrucks 0 > aa. In der Tat ist es schwer, herauszufinden, wie man mit der „Warum“ Frage kam. Durch die Logik, one'd eine "Warum" Frage erwarten, wenn der Freund wurde nicht in diesem Fall genannt.

Wenn Sie den Ausdruck zu 0.0 > aa ändern, wird der Anruf beciome mehrdeutig, weil neuther Weg besser sein wird als die andere.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top