Funktoren

Funktoren, auch Funktionsobjekte genannt, überladen den Operator, der für Funktionsaufrufe verantwortlich ist. Auf Deutsch: Man kann eine Objektinstanz wie eine Funktion benutzen:

Fraction f( 1, 2 );
int a=1, b=2;
 
f();
f( a );
f( a, b );

Die Besonderheit von Funktoren gegenüber des Index-Operators ist, dass man - wie bei Funktionsaufrufen üblich - auch mehrere Argumente übergeben kann.

Endsprechend kann man diesen Operator mit beliebigen Argumenten und mit einer beliebigen Anzahl von Argumenten überladen. Die folgenden Beispiele erheben keinen Anspruch darauf, besonders sinnvoll zu sein:

Fraction Fraction::Fraction operator() ()
{
  return *this;
}
Fraction Fraction::Fraction operator() ( int factor )
{
  return Fraction( *this ) *= factor;
}
Fraction Fraction::Fraction operator() ( int factor, int add )
{
  return Fraction( *this ) *= factor += add;
}

Ebenso wie beim Index-Operators ist zu entscheiden, ob eine Referenz oder ein neues Objekt übergeben werden soll. Im ersten Falle, wo keine Parameter übergeben werden, wäre eine Referenz schneller.Dies würde aber erlauben, dass das Objekt, auf das this zeigt, ver&auuml;ndert werden könnte. Das ist aber vielleicht gar nicht gewünscht; daher kann man bei kleinen Objekten,die schnell initialisiert sind, auch einfach eine Kopie übergeben.

Handelt es sich um große Objekte, die aufwendig erstellt oder kopiert werden müssten, lässt sich das Programm deutlich beschleunigen, indem eine konstante Referenz übergeben wird:

Fraction const & Fraction::Fraction operator() ()
{
  return *this;
}

Nun kann auf die Instanz nur noch mit Funktionen zugegriffen werden, die die Unveränderlichkeit der Instanz garantieren (const-Methoden).