Überladung von Operatoren
Überladung des Operators »+«
Die C++ -Implementation enthält zwei Programme: Eines für eine numerische Addition »int+int« und eines für eine Zeichenfolgenverbindung »::std::string+::std::string«. Bei der Übersetzung einer Anwendung des Operators »+« bildet der Compiler aus dem Ausdruck eine Signatur und verwendet diese, um das Programm festzulegen, das die Division ausführen soll.
main.cpp
#include <iostream>
#include <ostream>
#include <string>
using namespace ::std::literals;
int main() { ::std::cout << 1 + 2 << "\n"s; }- Protokoll
3
::std::cout
abcdef
main.cpp
#include <iostream>
#include <ostream>
#include <string>
using namespace ::std::literals;
int main() { ::std::cout << "abc"s + "def"s << "\n"s; }::std::cout
abcdef
Überladung des Operators »/«
Die C++ -Implementation enthält zwei Programme: Eines für eine ganzzahlige Division „int /int “ und eines für eine Division mit Nachkommastellen „double /double “. Bei der Übersetzung des Programms bildet der Compiler aus dem Ausdruck eine Signatur und verwendet diese, um das Programm festzulegen, das die Division ausführen soll.
Der Typ des gesamten Ausdrucks und seines Wertes ergibt sich gemäß der folgenden Tabelle.
- Typ der Division
- int /int = int
- double /double = double
Überladung des unären Operators »-«
Es gibt zwei verschiedene Programme für einen Typwechsel: Das Programm »-int« kann das Vorzeichen eines int-Wertes wechseln, während das Programm »-double« das Vorzeichen eines double-Wertes wechseln kann.
Wenn der Ausdruck »-2« ausgewertet werden soll, dann bildet die Implementation zunächst die Signatur dieses Ausdrucks. Das ist »-int«. Anschließend wird das passende Programm »-int« gestartet, um das Vorzeichen zu ändern.
Wenn der Ausdruck »-2.3« ausgewertet werden soll, ergibt sich die Signatur »-double«, und entsprechend wird das Programm »-double« gestartet.
Ein bestimmtes Programm, das bei Verwendung eines Operators ausgeführt wird, bezeichnen wir auch als eine Implementation (Umsetzung, Realisierung, Verwirklichung) dieses Operators. Wenn keine Mißverständnisse möglich sind, spricht man auch einfach kurz von einer Implementation. Der Operator »-« hat zwei Implementationen : »-int« für den Vorzeichenwechsel bei int-Werten und »-double« für den Vorzeichenwechsel bei double-Werten.
- Polymorphie: zum Operator »-« gehören zwei verschiedene Implementationen (Programme)
- »-2« --> -int --> Vorzeichenwechselprogramm für int-Werte
- »-2.3« --> -double --> Vorzeichenwechselprogramm für double-Werte
Der Programmierer muß also nicht selber das passende Programm für den Operator »-« festlegen, sondern es wird an Hand des Typs des Operanden von der Implementation automatisch richtig ausgewählt.
- Ohne Polymorphie wären verschiedene Operatorzeichen notwendig
- ⊟ = Vorzeichenwechselprogramm für int-Werte
- ⊖ = Vorzeichenwechselprogramm für double-Werte
- ⊟ 65
⊖ 65.0
Die Fähigkeit eines Operators, wie »-«, für mehrere Programme zu stehen, die dann an Hand des Typs des Operanden ausgewählt werden, wird Polymorphie genannt, und der zugehörige Operator wird auch als polymorph bezeichnet.
Man sagt auch manchmal, der Operator sei überladen, also mit verschiedenen Bedeutungen für verschiedene Typen „beladen“, und nennt diese Überladung eines Operators Operatorüberladung (eine Form von Polymorphie ).
Unter Auflösung verstehen wir, bei einer Mehrdeutigkeit zu erkennen, welche der möglichen Bedeutung genau vorliegt. Eine Überladungsauflösung besteht darin, bei einer Überladung zu erkennen, welche der verschiedenen Bedeutungen des Überladenen vorliegt.
Datentypen erlauben es, zu erkennen, ob die Anwendung eines Operators auf einen Ausdruck überhaupt zulässig ist. So kann »-"2"« als Fehler erkannt werden. Außerdem erlauben es Datentypen, wenn die Anwendung als zulässig erkannt wurdem, dem Operator das richtige Programm zuzuordnen, wie eben erklärt wurde. Ohne Datentypen und Polymorphie müßte der Programmierer diese Arbeit erledigen, indem er für int-Numeralia einen anderen Operator verwendet als für double-Numeralia.
Die Polymorphie „versteckt“ den genauen Typ eines numerischen Operanden gewissermaßen vor dem Programmierer. Dieser muß sich bei der Festlegung eines Operators zum Vorzeichenwechsel keine Gedanken darüber machen, ob ein Operand den Typ »int« oder »double« hat, denn er kann den Operator »-« gleichermaßen verwenden.
Die Polymorphie ist genauso eine Eigenschaft natürliche Sprachen: Man kann ein Auto oder ein Hemd „waschen“, obwohl die genaue Vorgehensweise (Implementation, Umsetzung, Realisierung, Verwirklichung) jeweils unterschiedlich ist.