Die Überladung von Funktionsnamen in C++
Wenn zwei oder mehr Definitionen für einen Bezeichner im selben Bereich gelten, dann sagt man auch, diese Bezeichner sei überladen. Ein überladener Funktionsname gehört also zu mehreren, verschiedenen Funktionen. Wenn ein überladener Funktionsname auf Argumente angewendet wird, dann wird der Typ der Argumente mit dem Typ der Parameter der Funktionen mit diesem Namen verglichen, um die anzuwendende Funktion zu bestimmen.
Mehrere Funktionen, die eines Gültigkeitsbereichs den gleichen Namen miteinander teilen, müssen sich allerdings in der Zahl oder wenigstens den Typen ihrer Parameter ausreichend unterscheiden.
In dem folgenden Beispiel werden zwei Funktionen mit dem Bezeichner "print" definiert, deren Argument vom Typ "bool" bzw. vom Typ "double" ist.
ueberladung.cpp#include <iomanip> // ::std::setprecision
#include <ios> // ::std::boolalpha
#include <iostream> // ::std::cout
#include <ostream> // <<
namespace
{ void print( const bool wert )
{ std::cout << ::std::boolalpha << wert; }
void print( const double wert )
{ std::cout << ::std::setprecision( 2 )<< wert; }}
int main()
{ const bool b( true );
const double d( 3.1415926 );
print( b ); print( d );
::std::cout << '\n'; }std::couttrue3.1
Ohne die Möglichkeit der Funktionsnamensüberladung, müßte man den beiden Funktionen verschiedene Namen geben. Die Namen wären so aber mühevoller zu erlernen und ihre Verschiedenheit wäre unpassend, wenn sie das gleiche Konzept darstellen, nur für unterschiedliche Datentypen. Die Funktionsnamensüberladung erlaubt hier eine viel natürlichere Formulierung unter Beibehaltung der Typstrenge, durch die Kontrolle der Verwendung von Ausdrücken anhand ihres Datentyps bei der maschinellen Analyse eines C++ -Programms.
- Übungsaufgaben
Erweitern Sie das obige Programmbeispiel um eine Funktion "print" für die Ausgabe eines Wertes des Datentyps "int" und probieren Sie diese durch Aufrufe in der Funktion "main" aus.
Definieren Sie drei Wirkfunktionen "printtype" jeweils für ein Argument vom Datentyp "bool", vom Datentyp "int" und vom Datentyp "double". Jede Wirkfunktion soll den Namen des Datentyps ihres Argumentes ausgeben.
ueberladung1.cpp#include <iostream> // ::std::cout
#include <ostream> // <<
// ... Hier Wirkfunktionen definieren
int main()
{ printtype( true ); ::std::cout << '\n';
printtype( 3.1415926 ); ::std::cout << '\n';
printtype( 0 ); ::std::cout << '\n'; }std::coutbool
double
int
Erweiterung von Funktionen
Eine Anwendung der Überladung von Funktionsnamen ist die Möglichkeit zur kompatiblen Erweiterung von Funktionsschnittstellen. Eine Funktion mag zunächst beispielsweise zwei Parameter haben. Es kann sich dann aber später herausstellen, daß es hilfreich wäre, einen weiteren Parameter zu der Funktion hinzuzufügen. Dann müßte alle Klienten der Funktion aber entsprechend angepaßt werden, was nicht immer möglich ist.
Dank der Möglichkeit zur Überladung von Funktionsnamen kann dann aber eine weitere Funktion mit gleichem Namen und einem zusätzlichen Parameter definiert werden, ohne daß die bisher schon existierende Funktionsdefinition mit zwei Parametern dazu verändert werden muß. Dann können die bisherigen Klienten weiterhin die bisherige Funktion mit zwei Parametern verwenden, während neuere Klienten die neue Funktion mit drei Parametern verwenden können.