operator-keyword

___ answer4773111 ___

Zuerst müssen Sie den Unterschied zwischen %code% und %code% verstehen.

Die Methode %code% eines Objekts ist eine normale Addition: Sie benötigt zwei Parameter, gibt ihre Summe zurück und ändert keinen der Parameter.

Die Methode %code% eines Objekts nimmt auch zwei Parameter, macht aber die Änderung an Ort und Stelle und ändert den Inhalt des ersten Parameters. Da dies eine Objektmutation erfordert, sollten unveränderliche Typen (wie die Standard-Zahlentypen) keine Methode %code% haben.

%code% verwendet %code% . %code% verwendet %code% , wenn es existiert; Ist dies nicht der Fall, emuliert es es über %code% , wie in %code% . %code% und %code% unterscheiden sich auf die gleiche Weise.

Zur anderen Frage: %code% ist nicht äquivalent zu %code% , denn wenn kein %code% existiert, wird stattdessen %code% verwendet. Sie müssen den Wert zuweisen, um sicherzustellen, dass das Ergebnis in beiden Fällen gespeichert wird: %code% .

Sie können das selbst leicht sehen:

%Vor%     
___ tag123function ___ Eine Funktion (auch als Prozedur, Methode, Unterroutine oder Routine bezeichnet) ist ein Teil des Codes, der dazu bestimmt ist, eine einzelne, spezifische Aufgabe auszuführen. Verwenden Sie dieses Tag für Fragen, die speziell das Erstellen oder Aufrufen von Funktionen betreffen. Wenn Sie Hilfe beim Implementieren einer Funktion zum Ausführen einer Task benötigen, verwenden Sie stattdessen [algorithm] oder ein taskspezifisches Tag. ___ qstnhdr ___ Wie unterscheiden sich die Operatorfunktionen von Python von den Standardoperatorfunktionen? ___ answer4772998 ___

Vielleicht, weil einige Python-Objekte unveränderlich sind.

Ich denke, %code% entspricht %code% nur für veränderbare Typen wie Wörterbücher und Listen, aber nicht für unveränderliche Typen wie Zahlen und Zeichenfolgen.

    
___ tag123operatoryeyword ___ In mehreren Sprachen wird das Schlüsselwort operator verwendet, um Methoden zu identifizieren, die beim Überladen von Operatoren verwendet werden. ___ qstntxt ___

Warum ist %code% nicht äquivalent zu %code% ? Und wie unterscheidet sich %code% von %code% ?

Aus den Dokumenten :

  

Viele Operationen haben einen "In-Place"   Ausführung. Die folgenden Funktionen   bieten einen primitiveren Zugang zu   In-Place-Betreiber als die üblichen   Syntax tut; zum Beispiel, die   Anweisung x + = y ist äquivalent zu x =   operator.iadd (x, y). Ein anderer Weg   sagen wir, dass z =   operator.iadd (x, y) ist äquivalent zu   die zusammengesetzte Aussage z = x; z + = y.

In Verbindung stehende Frage , aber ich interessiere mich nicht für Python-Klassenmethoden; nur reguläre Operatoren für integrierte Python-Typen.

    
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___
12
Antworten

Welches Symbol für den Division Operator würden Sie wählen?

Ich entwerfe und implementiere gerade eine kleine Programmiersprache als ein Extra-Kredit-Projekt in einer Klasse, die ich mache. Mein Problem ist, dass die Sprache drei numerische Typen hat: Long, Double und Fraction. Brüche können in der Sprac...
29.04.2010, 23:11
2
Antworten

Operator == kann in Kotlin nicht auf 'Long' und 'Int' angewendet werden

Ich versuche Teile von Mike Penz 'NavigationDrawer ( Ссылка ) in Kotlin zu implementieren. Seither bin ich nur auf einige Probleme gestoßen, vor allem mit Betreibern. Hier ist ein Teil des Codes, um die Schublade selbst zu instanziieren. Android...
01.05.2017, 15:09
2
Antworten

C ++ - Überladen [] -Operator

Ich habe eine Template-Klasse Array: %Vor% Ich habe einige Fragen zum Operator [] overloading (Ich habe dieses Beispiel im Netz gefunden). Ich verstehe, dass T& operator [](int idx) den Verweis auf den Array-Wert mit dem Index...
04.01.2016, 14:22
2
Antworten

Unter OS X gibt das einfache C ++ - Programm falsche Ergebnisse (die aus den Befehlszeilenoptionen 'c ++ 03' und 'c ++ 11' resultieren).

Dieses einfache Programm (wenn es unter Linux kompiliert wird) gibt CORRECTly zwei verschiedene Antworten basierend darauf, ob es mit -std=c++0x kompiliert wurde oder nicht. Problem: Ich kann dasselbe unter OS X nicht reproduzieren (Mounta...
20.01.2013, 17:09
5
Antworten

___ answer3891846 ___

Damit der Bediener überlastet wird, muss die Funktion funktionieren im selben Namespace wie einer seiner Operanden. Ansonsten, ADL findet es nicht. Dies bedeutet den Namensraum Ihrer Klasse für Operatoren wie + und -. Theoretisch könnten Sie den Operator & lt; & lt; entweder in std oder im selben Namespace wie Ihre Klasse, aber die Standard verbietet das Definieren neuer Funktionen in Std, also auch hier setze es in den gleichen Namespace wie die Klasse.

(Und natürlich implementieren Sie nicht + oder -, sondern + = und - =, und dann von einer Vorlage abgeleitet werden, die + und liefert - automatisch.)

    
___ qstntxt ___

Beim Durchsuchen von SO finde ich oft Fragen oder Antworten, die ein Überladen / Definieren von %code% oder %code% beinhalten.

Während ich weiß, wie und wann (nicht) ich diese Operatoren schreiben soll, bin ich verwirrt über das Thema %code% .

Wenn ich die folgende Klasse habe:

%Vor%

In welcher %code% sollte ich die verschiedenen Operatordefinitionen schreiben?

%Vor%

Dieselbe Frage gilt für %code% . Also, was ist die gute Praxis hier und warum ?

    
___ answer3891544 ___

Die beste Wahl ist Option 1. Warum? Wenn Sie einen unqualifizierten Funktionsnamen verwenden (ein überladener Operator ist eine Funktion), wird neben dem normalen Namenssuchen eine argumentabhängige Suche angewendet, dh (informell) alle Namespaces, in denen die Argumente deklariert wurden, werden durchsucht. ZB

%Vor%

Das gleiche gilt für Operatoren.

Andererseits wird im Fall von Option 2 der Operator immer noch gefunden, weil ostream in std ist (gleiche ADL-Regel). Aber es ist keine gute Idee, dem Namespace std Dinge hinzuzufügen.

Und die dritte Option ist schlecht, stilistisch - warum, wenn die erste Option ausreicht?

Also, definitiv Option 1.

HTH.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer3891478 ___

Es sollte im Namensraum %code% sein. Sie müssen überlegen, was die Oberfläche für die Klasse ausmacht und diese zusammen gruppieren.

"Eine Klasse beschreibt eine Reihe von Daten zusammen mit den Funktionen, die mit diesen Daten arbeiten." Ihre kostenlose Funktion arbeitet mit %code% , daher ist sie Teil von %code% . Es sollte mit %code% im Namespace %code% gruppiert werden.

Argumentabhängige Lookup , oder ADL, finden die Funktion.

Wir wissen auch, dass Nicht-Freund-Nichtmitgliedsfunktionen bevorzugen . Das bedeutet, dass Ihre Klassen im Allgemeinen ihre Definitions- und Mitgliedsfunktionen haben, unmittelbar gefolgt von freien Funktionen, die auf der Klasse funktionieren.

    
___ answer3891576 ___

Es empfiehlt sich, die (Nicht-Member-) Operatoren im selben Namespace wie die Klasse zu deklarieren, deren Schnittstelle sie angehören.

Für etwas wie %code% ist das ziemlich einfach: Es funktioniert nur auf Foo-Objekten, also sollte es im selben Namensraum wie Foo selbst laufen. Für %code% und %code% können Sie immer noch zwischen den Namespaces %code% und %code% wählen. Zuallererst sollten Sie dem Namespace %code% keine Funktion / Operator-Überladungen hinzufügen. Und zweitens besteht der wichtige Teil dieser Überladungen nicht darin, dass sie mit einem Stream arbeiten, sondern dass sie ein Foo-Objekt lesen / schreiben. Es macht also mehr Sinn, sie mit der Foo-Klasse zu bündeln.

Es sollte auch angemerkt werden, dass die Regeln von C ++ so entworfen sind, dass überladene Operatoren, die im selben Namespace definiert sind wie die Klasse, auf der sie arbeiten, fast immer korrekt gefunden werden, während dies viel öfter schief gehen wird, wenn Operatoren werden in einem anderen, nicht verwandten Namespace deklariert.

    
___ tag123namespaces ___ Ein Namespace ist ein Container, der Kontext für Bezeichner bereitstellt, in denen Namen eindeutig sind. ___ tag123operatoryeyword ___ In mehreren Sprachen wird das Schlüsselwort operator verwendet, um Methoden zu identifizieren, die beim Überladen von Operatoren verwendet werden. ___ tag123operatoroverloading ___ Operatorüberladung ist eine Funktion einer Programmiersprache, die benutzerdefinierte Implementierungen für Operatoren abhängig von den Typen der beteiligten Operanden ermöglicht. Einige Sprachen erlauben die Definition neuer Operatoren, während andere nur die Neudefinition bestehender Operatoren erlauben. ___ answer3891512 ___

Die Regel besteht darin, dass bei der Suche nach einer geeigneten Funktionsüberladung sowohl der aktuelle Namespace als auch alle Namespaces der Argumenttypdefinitionen berücksichtigt werden. Dies nennt sich Argument Dependent Lookup (ADL).

Also wenn du diesen Code hast:

%Vor%

Die folgenden Namespaces werden berücksichtigt:

  • Der aktuelle Namespace
  • :: std, weil der Typ von os dort definiert ist
  • :: bar, weil der Typ von foo dort definiert ist

Also alle drei Möglichkeiten, die du genannt hast, funktionieren und sind daher auf den ersten Blick "gut genug".

Wie auch immer ....

Sie dürfen keine neuen Funktionen in :: std definieren, damit Sie Ihren überladenen Operator nicht in diesen Namespace setzen können. (Sie dürfen Vorlagen in :: std spezialisieren, aber das ist nicht, was wir hier tun)

Zweitens kann sich der "aktuelle Namespace" ändern. Wenn Sie also Ihre Funktionsdefinition in diesen Namespace stellen, wird sie möglicherweise nicht immer gefunden.

Am Ende befindet sich der beste Ort, um den überladenen Operator zu platzieren, im selben Namensraum wie Foo:

%Vor%     
___

Beim Durchsuchen von SO finde ich oft Fragen oder Antworten, die ein Überladen / Definieren von std::ostream& operator<<(std::ostream& os, const Foo& foo) oder Foo operator+(const Foo& l, const Foo& r) beinhal...
08.10.2010, 14:11
4
Antworten

Benutzerdefinierte Conversions in C ++

Vor kurzem habe ich meine Kopie von der C ++ Pocket Reference von O'Reilly Media gelesen und war überrascht, als ich auf einen kurzen Abschnitt und ein Beispiel bezüglich der benutzerdefinierten Konvertierung für Benutzer stieß. Definierte Typ...
09.06.2010, 18:25
4
Antworten

Lazy, überladener C ++ && Operator?

Ich versuche, meine eigene boolesche Klasse zu implementieren, kann aber native Semantiken für & amp; & amp; nicht replizieren. Der folgende erfundene Code demonstriert das Problem: %Vor% Beim Kompilieren und Ausführen lautet das Ergebnis:...
16.04.2013, 08:07
4
Antworten

C # logische Operation Frage

warum das stimmt: %Vor% und das ist falsch: %Vor% sollte meiner Meinung nach das Gegenteil sein.     
11.02.2011, 11:35
5
Antworten

Seltsames Verhalten Java + = Operator

Kann mir das jemand erklären, %Vor% wertet der Operator += zuerst die rechte Seite aus und verkettet sie dann mit der linken Seite?     
07.02.2012, 18:12
3
Antworten

Verwendet der '' ?? '' Operator Shortcircuit?

Verwendet der Operator ?? in C # bei der Auswertung Kurzzirkel? %Vor% Wenn myObject nicht null ist, wird das Ergebnis von ExpressionWithSideEffects() nicht verwendet, aber wird ExpressionWithSideEffects() vollständig übersprungen...
23.06.2010, 16:28