Überladen logischer Operatoren als schlechte Übung?

7

Ist es eine schlechte Idee, "& amp; & amp;" zu überlasten? oder Komma-Operator und Warum?

    
cpx 27.02.2011, 12:05
quelle

7 Antworten

11

Ich würde operator&& oder operator|| nicht überladen. Selbst wenn Sie eine Klasse definieren, die zu einer Booleschen Algebra führt (zum Beispiel endliche Mengen), wäre es wahrscheinlich eine bessere Wahl, operator& und operator| zu überladen.

Der Grund ist, dass C ++ - Programmierer spezielle Semantiken für operator&& und operator|| erwarten: Sie sind kurzgeschlossen , d. h. bewerten ihr Argument für die rechte Seite nicht, wenn dies nicht notwendig ist. Sie können dieses Verhalten nicht durch Überladen erhalten, da Sie eine Funktion definieren werden.

Das Überladen von operator, wurde z.B. die Bibliothek Boost.Assign . Dies ist auch das einzige Beispiel für eine Überlastung, die ich kenne, und ich habe nie daran gedacht, es selbst zu überlasten. Sie sollten einen sehr spezifischen Anwendungsfall dafür haben, wo kein anderer Operator geeignet ist.

    
Fred Foo 27.02.2011, 12:18
quelle
4

Um die logischen Operatoren in C ++ zu überladen, müssen die Operanden ausgewertet werden, was normalerweise nicht mit Kurzschlüssen von eingebauten Typen funktioniert.

Sehen Sie sich den folgenden Link an.

Javascript is GOD 27.02.2011 12:08
quelle
3

Sie sollten keine Operatoren auf überraschende Weise überladen. :-)

Wenn Sie es auf eine Weise tun können, die (nicht nur für Sie) Sinn macht, ist es in Ordnung, dies zu tun.

Wie andere bereits gesagt haben, sind die logischen Operatoren dadurch besonders, dass sie den Effekt einer faulen Bewertung haben. Daher sollten Ihre Überladungen wahrscheinlich diesen Lazy-Effekt beibehalten, wie bei Expression-Templates, oder nur verwendet werden, wenn die Leute diesen Effekt sowieso nicht erwarten.

    
Bo Persson 27.02.2011 14:07
quelle
3

Es ist normalerweise eine schlechte Idee: Diese drei Operatoren haben einen Sequenzeffekt, der verloren geht, wenn Sie sie überladen. Der Verlust dieses Sequenzierungseffekts kann zu einem Arm (d. H. Seltsamen Fehlern) für diejenigen führen, die das nicht erwarten.

Es gibt Fälle mit Vorlagenausdrücken, bei denen Sie den Sequenzierungseffekt beibehalten können. In diesen Fällen sehe ich kein Problem darin, sie zu überladen.

Die Überladungen von operator, , von denen ich weiß, haben ein anderes Problem: Sie arbeiten so, dass die scheinbaren Operationsketten nicht die wahren sind. Normalerweise werden sie im Zusammenhang verwendet, wenn es keinen Unterschied macht, aber einmal in einem blauen Mond, das ist eine andere Quelle für eine seltsame Bugs.

    
AProgrammer 27.02.2011 12:45
quelle
2

Ich würde sagen, es hängt davon ab, was Ihre Überlastungen tun. Zum Beispiel & amp; & amp; und || Es wird erwartet, dass sie als logische Bedingungen funktionieren. Wenn Ihre Überladungssemantik also irgendwie anders funktioniert, können sie andere Leute verwirren (oder Sie selbst, wenn Sie sie eine Zeit lang nicht benutzen und vergessen, was sie tun). Überlegen Sie, was Sie von den Operatoren erwarten würden, wenn Sie nicht wissen, wie sie überlastet sind und ob es einfacher wäre, stattdessen normale Methoden zu verwenden.

    
esaj 27.02.2011 12:14
quelle
2

Wie die anderen bereits gesagt haben, ist die fehlende Lazy-Evaluierung der Hauptgrund dafür, logische Operatoren nicht zu überlasten.

Es gibt jedoch einen sehr guten Grund, sie zu überladen: Ausdruckvorlagen . Die Boost.Lambda-Bibliothek tut dies und das ist sehr nützlich!

    
ltjax 27.02.2011 12:44
quelle
0

Es ist eine schlechte Idee, außer Situationen, in denen Ihre Klassen eine logische Entität darstellen, weil überladene Operatoren desorientieren und neue Fehler im Code verursachen können.

    
Kyrylo M 27.02.2011 12:10
quelle