2016-04-23 1 views
3

Wenn die Postfix-Operator Überlastung, ich etwas Einfaches wieZweck des Dummy-Parameters in Postfix Operator Overload? C++

Class Foo 
{ 
private: 
    int someBS; 
public: 
    //declaration of pre &postfix++ 
    Foo operator++(); 
    //rest of class not shown 
}; 

Präfix benötigt keine Parameter nehmen tun können, also wenn ich definieren es, so etwas wie

Foo Foo::operator() 
{ 
    someBS ++; 
    return *this; 
} 

und es macht vollkommener Sinn für mich.

Wenn ich die Postfix Überlastung I

Foo Foo::operator++(int) 
{ 
    Foo temp = *this; 
    someBS ++; 
    return temp; 
} 

Meine Frage ist, warum einen Dummy-int-Parameter enthalten müssen definieren? Ich benutze es nie in der Methode. Der Präfix-Operator benötigt keinen. Das Postfix, das den Wert temp zurückgibt, ist nicht vom Dummy-Parameter abhängig. Ich weiß, wenn ich wollen einen Postfix-Operator überladen, wie es getan wird, will ich nur den Grund wissen.

+1

Welche alternative Möglichkeit würden Sie vorschlagen? –

+0

@AlanStokes, keine Alternative. Angesichts dessen, dass ich mich seines Zwecks nicht sicher war, hatte ich sicherlich keine Möglichkeit, das anders zu machen. – Podo

+1

@AlanStokes, Wie wäre es mit 'Foo ++ operator()' und 'Foo operator ++()'? ;) (Nur 5% seriös ...) – kloffy

Antwort

5

Der Dummyparameter ist einfach da, um zwischen den Postfix- und Präfixoperatoren zu unterscheiden. Der Name ++ oder -- ist in beiden Fällen gleich, so dass es einige Weise geben muss, welche Sie definieren. Das Hinzufügen eines Dummyparameters ist vielleicht nicht elegant, aber alle Alternativen hätten wahrscheinlich die Erfindung einer neuen Syntax erfordert (vielleicht ein Schlüsselwort postfix, das den Code, der postfix verwendet, als einen Identifikator verwenden würde).

+0

Also, wenn ich die Methode mit einem Klassenobjekt aufrufen will, sagen wir etwas wie "Foo lilBunny;", wenn ich das Postfix darauf verwenden wollte, welchen Wert würde ich in den Parameter aufnehmen? Schrott? Wenn es dumm ist, muss etwas passieren, aber da es nichts macht, macht das, was ich passiere, eine Rolle. – Podo

+1

@ JeffreyDilley: Sie übergeben nichts. Sie sagen einfach "lilBunny ++;" - Der Compiler bestimmt, dass Sie die Postfix-Version durch die Tatsache, dass Sie das '' '' '' nach dem Variablennamen anstelle von vorher setzen. –

1

zu zitieren cppreference:

Der int-Parameter ist ein Dummy-Parameter verwendet, um zwischen Präfix und Postfix Versionen der Operatoren zu unterscheiden.

Das Zitat sagt alles, denn wie sonst würden Sie Präfix und Postfix unterscheiden?

Sagen wir einfach, dass Sie die int Parameter nicht benötigen, dann das Präfix (Foo operator++()) und Postfix (Foo operator++()) wäre genau das gleiche! Wie würde der Compiler wissen, was du gemeint hast? Deshalb gibt es diesen Dummy int Parameter.

1

Unter Berufung auf C++reference hier:

Präfix Versionen der integrierten Operatoren Rückgabe Referenzen und Postfix-Versionen Wert zurück, und typische benutzerdefinierte Überlastungen folgen dem Muster, so dass die benutzerdefinierten Operatoren können in verwendet werden die gleiche Weise wie die eingebauten.

erklären dies logisch:

int a = 3; 
int b = 0; 

int c = a + ++b; 
int d = a++ + b; 

In der dritten Zeile ++b gibt Ihnen einen Verweis auf den aktualisierten Wert; In der vierten Zeile ist das nicht möglich: a muss erhöht werden, so dass eine Wertkopie erstellt und zu b hinzugefügt wird. Das diktiert unterschiedliche Semantiken für die Operatoren.

In der Tat, nur zu vermeiden, um einen anderen Name des Bedieners mit:

Der int-Parameter ist ein Dummy-Parameter verwendet, um zwischen Präfix und Postfix Versionen der Operatoren zu unterscheiden. Wenn der benutzerdefinierte Postfix-Operator aufgerufen wird, ist der in diesem Parameter übergebene Wert immer Null, obwohl er durch Aufruf des Operators mit Funktionsaufrufnotation (zB a.operator ++ (2) oder operator ++ (a, 2)) geändert werden kann. .