<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=%C3%9Cberladen</id>
	<title>Überladen - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=%C3%9Cberladen"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=%C3%9Cberladen&amp;action=history"/>
	<updated>2026-06-21T02:31:22Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=%C3%9Cberladen&amp;diff=142574&amp;oldid=prev</id>
		<title>imported&gt;L47: /* Operatorüberladung */ Fehlende Satzzeichen ergänzt.</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=%C3%9Cberladen&amp;diff=142574&amp;oldid=prev"/>
		<updated>2021-10-20T06:15:51Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Operatorüberladung: &lt;/span&gt; Fehlende Satzzeichen ergänzt.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Dieser Artikel|erläutert das Konzept des Überladens bei Programmiersprachen. Zu anderen Bedeutungen siehe [[Überladung]].}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Überladen&amp;#039;&amp;#039;&amp;#039; (von {{enS|&amp;#039;&amp;#039;overloading&amp;#039;&amp;#039;}}) bedeutet in der Softwareentwicklung das bewusste Etablieren von [[Polymorphie (Programmierung)|Polymorphien]], sodass ein und dasselbe Sprachelement – [[Operator (Mathematik)|Operatoren]], [[Konstruktoren und Destruktoren|Konstruktoren]], [[Literal]]e und dergleichen – unterschiedliche, aus dem Kontext hervorgehende Bedeutungen annehmen können. Das Überladen wird, da es sich um einen rein syntaktischen Mechanismus handelt, nach [[Christopher Strachey|Strachey]] als &amp;#039;&amp;#039;Ad-hoc-[[Polymorphie (Programmierung)|Polymorphie]]&amp;#039;&amp;#039; betrachtet.&lt;br /&gt;
&lt;br /&gt;
Nicht alle [[Programmiersprache]]n ermöglichen das Überladen, als Verfahren ist es insbesondere bei objektorientierten Programmiersprachen anzutreffen.&lt;br /&gt;
&lt;br /&gt;
== Erläuterung an einem Beispiel ==&lt;br /&gt;
In vielen Programmiersprachen steht der Operator &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; für verschiedene, durchaus unterschiedliche, Operationen:&lt;br /&gt;
&lt;br /&gt;
 1 + 2&lt;br /&gt;
 &amp;quot;abc&amp;quot; + &amp;quot;def&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Im ersten Fall ist das erwartbare Ergebnis &amp;quot;3&amp;quot;, also eine Integer-[[Addition]], im zweiten &amp;quot;abcdef&amp;quot;, also eine [[Wort (Theoretische Informatik)#Konkatenation|String-Konkatenation]]. Dies sind im Grunde zwei sehr unterschiedliche Operationen. [[Compiler]] oder [[Interpreter]] von Sprachen, die eine solche sogenannte [[Polymorphie (Programmierung)|Polymorphie]] erlauben, tun dies, indem sie die anzuwendende Methode (Addition oder Konkatenation) aufgrund des Datentyps der beteiligten Operanden auswählen.&lt;br /&gt;
&lt;br /&gt;
Von &amp;#039;&amp;#039;&amp;#039;Überladung&amp;#039;&amp;#039;&amp;#039; spricht man nun, wenn eine solche Polymorphie nicht nur, wie im Falle des Beispiels, vorgefertigt in einer Sprache vorhanden ist, sondern darüber hinaus auch durch Sprachkonstrukte weitere solcher Polymorphien geschaffen werden können. Im obigen Beispiel etwa könnte die Sprache die Möglichkeit bieten, durch Programmtext eine zusätzliche Bedeutung des &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;-Operators für andere Datentypen (etwa Arrays) zu etablieren. (Dies wäre dann ein Beispiel für [[#Operatorüberladung|Operatorüberladung]].)&lt;br /&gt;
&lt;br /&gt;
== Methodenüberladung ==&lt;br /&gt;
Methodenüberladung liegt vor, wenn mehrere [[Methode (Programmierung)|Methoden]] denselben Namen haben, sie aber verschiedene Parameter (engl. &amp;#039;&amp;#039;argument&amp;#039;&amp;#039;) erwarten. Welche Methode genau aufgerufen wird, wird dann bei jedem Aufruf anhand der Parameter und ihrer Datentypen automatisch vom Compiler bestimmt. Ein typisches Beispiel ist eine Methode, die sowohl Texte ([[Zeichenkette|Strings]]) als auch ganze Zahlen ([[Integer (Datentyp)|Integer]]) auf dem Bildschirm ausgeben können soll. Beispiel aus [[Pascal (Programmiersprache)|Pascal]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
procedure GibAus(text: String); overload;&lt;br /&gt;
begin&lt;br /&gt;
    writeln(text); // übergebenen Parameter ausgeben&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure GibAus(zahl: Integer); overload;&lt;br /&gt;
var&lt;br /&gt;
    zahlAlsText: String;&lt;br /&gt;
begin&lt;br /&gt;
    zahlAlsText := IntToStr(zahl); // übergebene Zahl in einen Text umwandeln&lt;br /&gt;
    writeln(zahlAlsText); // ausgeben&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    GibAus(&amp;#039;Hallo Welt!&amp;#039;); // gibt den Text &amp;quot;Hallo Welt!&amp;quot; aus&lt;br /&gt;
    GibAus(4711);          // gibt die Zahl 4711 aus&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Falle von [[Funktion (Programmierung)|Funktionen]] ist in manchen Sprachen auch die Überladung anhand des &amp;#039;&amp;#039;Ergebnis&amp;#039;&amp;#039;-Typs möglich.&lt;br /&gt;
&lt;br /&gt;
Nachteil ist ein Verlust an Übersichtlichkeit und dass Probleme auftreten können, wenn nachträglich weitere Überladungen hinzugefügt werden (vgl. das unten verlinkte Wikibook).&lt;br /&gt;
&lt;br /&gt;
=== Abgrenzung ===&lt;br /&gt;
==== Standardwerte ====&lt;br /&gt;
Keine Methodenüberladung im eigentlichen Sinne ist der &amp;#039;&amp;#039;Standardwert&amp;#039;&amp;#039; (engl. &amp;#039;&amp;#039;default argument&amp;#039;&amp;#039;), welcher ebenfalls dazu führt, dass eine – allerdings dieselbe – Methode mit unterschiedlichen, nämlich unterschiedlich vielen, Parametern aufgerufen werden kann. Wird ein Parameter ausgelassen, wird hierbei stattdessen der Standardwert übergeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
procedure GibAus(text: string = &amp;#039;kein Parameter übergeben&amp;#039;);&lt;br /&gt;
begin&lt;br /&gt;
    writeln(text); // übergebenen Parameter ausgeben&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    GibAus(&amp;#039;Hallo Welt!&amp;#039;); // gibt &amp;quot;Hallo Welt!&amp;quot; aus&lt;br /&gt;
    GibAus();              // gibt den Standardwert &amp;quot;kein Parameter übergeben&amp;quot; aus&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Methoden mit Standardwert können problemlos in überladene Methoden überführt werden. Obiger Quelltext ist funktional mit folgendem identisch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
procedure GibAus(text: String); overload;&lt;br /&gt;
begin&lt;br /&gt;
    writeln(text); // übergebenen Parameter ausgeben&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure GibAus(); overload;&lt;br /&gt;
begin&lt;br /&gt;
    GibAus(&amp;#039;kein Parameter übergeben&amp;#039;); // fehlenden Parameter ergänzen&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    GibAus(&amp;#039;Hallo Welt!&amp;#039;); // gibt &amp;quot;Hallo Welt!&amp;quot; aus&lt;br /&gt;
    GibAus();              // gibt den Standardwert &amp;quot;kein Parameter übergeben&amp;quot; aus&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ist hilfreich in Sprachen, die Standardwerte nicht unterstützen, beispielsweise Java.&lt;br /&gt;
&lt;br /&gt;
==== Implizite Typumwandlungen ====&lt;br /&gt;
Ebenfalls von der Methodenüberladung zu unterscheiden sind implizite [[Typumwandlung]]en. In vielen Programmiersprachen lässt sich eine einzelne Methoden, die einen [[Gleitkommazahl|Gleitkommawert]] (Real) als [[Wertparameter]] erwartet, auch mit einer ganzen Zahl (Integer) aufrufen. Eine implizite Typumwandlung ist bei einem [[Referenzparameter]] nicht möglich, da [[Referenzparameter#Formale und tatsächliche Parameter|formale und tatsächliche Parameter]] übereinstimmen müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
function QuadriereWertparameter(basis: Real): Real;&lt;br /&gt;
begin&lt;br /&gt;
    result := basis * basis; // Ergebnis als Funktionswert zurückgeben&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure QuadriereReferenzparameter(var basis: Real);&lt;br /&gt;
begin&lt;br /&gt;
    basis := basis * basis; // Ergebnis dorthin schreiben, wo der Parameter herkam&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
    zahl: Integer;&lt;br /&gt;
begin&lt;br /&gt;
    zahl := 4711;&lt;br /&gt;
    QuadriereWertparameter(zahl); // implizite Typumwandlung (Ergebnis der Funktion wird verworfen)&lt;br /&gt;
    QuadriereReferenzparameter(zahl); // Compilerfehler, denn die aufgerufene Methode könnte keine Kommazahl zurückgeben, obwohl eine Kommazahl als Referenzparameter deklariert wurde&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Würde man im obigen Quelltext die folgende überladene Methode (und die &amp;lt;code&amp;gt;overload&amp;lt;/code&amp;gt;-Direktive bei der vorhandenen Methode) ergänzen, wäre das Programm kompilierbar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;procedure QuadriereReferenzparameter(var basis: Integer); overload;&lt;br /&gt;
begin&lt;br /&gt;
    basis := basis * basis;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operatorüberladung ==&lt;br /&gt;
Seit jeher unterschieden die meisten Programmiersprachen, der [[Mathematik|mathematischen]] Tradition folgend, nicht zwischen den [[Operator (Mathematik)|Operatorsymbolen]] (&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, …) für Ganzzahl- ([[Integer (Datentyp)|Integer]]&amp;amp;#x2011;) und [[Gleitkommazahl|Gleitpunktarithmetik]] (real, float). Zur bruchlosen Erweiterung einer Sprache um benutzerdefinierte Typen ist es hilfreich, die Operatorsymbole auch für benutzerdefinierte Typen überladen zu können.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel für das Überladen des Operators &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; in [[C++]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct komplexe_zahl {&lt;br /&gt;
    float real = 0;&lt;br /&gt;
    float imag = 0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
komplexe_zahl operator+(komplexe_zahl links, komplexe_zahl rechts) {&lt;br /&gt;
    return komplexe_zahl {links.real + rechts.real, links.imag + rechts.imag};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    komplexe_zahl z1 {5.0f, 3.14159f};&lt;br /&gt;
    komplexe_zahl z2 {0.0f, -3.14159f};&lt;br /&gt;
    komplexe_zahl z3 = z1 + z2; // z3.m_real = 5 und z3.m_imag = 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In C++ lassen sich fast alle vorhandenen Operatoren überladen, was in den meisten Fällen sowohl über freistehende Funktionen (wie hier) als auch über Methoden erfolgen kann.&lt;br /&gt;
&lt;br /&gt;
Ziel der Operatorüberladung ist die leichte [[Lesbarkeit]] des Quelltext, wobei stets beachtet werden sollte, inwieweit diese durch überladene Operatoren verbessert oder verschlechtert wird: Während beispielsweise &amp;lt;code&amp;gt;(a + b) * c&amp;lt;/code&amp;gt; klar besser zu lesen ist als &amp;lt;code&amp;gt;mal(plus(a, b), c)&amp;lt;/code&amp;gt; ist dies bei weitem nicht immer der Fall, insbesondere wenn die konkrete Überladung nicht weithin bekannten Konventionen folgt.&lt;br /&gt;
&lt;br /&gt;
Zuletzt ist anzumerken, dass es sich bei Operatorenüberladung nur um [[syntaktischer Zucker|syntaktischen Zucker handelt]] und es in aller Regel genau so möglich wäre die gewünschte Funktionalität auch durch normale Funktionen bzw. Methoden zu implementieren.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Polymorphie (Programmierung)]]&lt;br /&gt;
* [[Kovarianz und Kontravarianz|Kovarianz (Informatik)]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
*[[b:Strukturierte Programmierung#Überladung|Überladung]], Wikibook &amp;#039;&amp;#039;Strukturierte Programmierung&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{Normdaten|TYP=s|GND=4531051-8}}&lt;br /&gt;
&lt;br /&gt;
{{SORTIERUNG:Uberladen}}&lt;br /&gt;
[[Kategorie:Programmierkonzept]]&lt;/div&gt;</summary>
		<author><name>imported&gt;L47</name></author>
	</entry>
</feed>