Ursachen der Ineffizienz:
-
Die Funktion
elem()
wird bei jedem Aufruf von multipliziere()
3*(1+3*3)=30-
mal aufgerufen!
-
Wenn
elem()
zudem noch, was anzunehmen ist, eine Bereichsüberprüfung
für die übergebenen Parameter vornimmt, wird allein der häufige
Aufruf der Funktion elem()
die Funktion multipliziere()
inakzeptabel machen.
Daraus ergibt sich ganz schnell folgender
Wunsch:
-
Man möchte eine Lösung für das Problem finden, daß die Funktion
multipliziere()
gleichzeitig
ein Element beider Klassen sein kann. Damit hätten die Funktionen direkten Zugriff
auf die privaten Elemente beider Klassen, den Umweg über die
Zugriffsfunktionen könnte man einsparen.
Nun kann aber eine Elementfunktion nicht gleichzeitig Elementfunktion zweier
Klassen sein. Man benötigt vielmehr ein Sprachkonstrukt, das einer
Funktion den Zugriff auf die privaten Elemente einer Klasse erlaubt, ohne
daß eine Mitgliedschaft in dieser Klasse Voraussetzung ist.
Dies ist zwar im Grunde genommen nicht mit dem objektorientierten Ansatz
in Einklang zu bringen, wird aber dennoch von C++ zur Verfügung gestellt:
die friend-Funktion (gekennzeichnet durch das Schlüsselwort
friend). Hier wurde die strikte Objektorientiertheit zugunsten der
Effizienz verwässert.
Die friend-Funktion besitzt die oben geforderten Eigenschaften
und darf daher auch auf die privaten Elemente der Klasse, dessen Freund sie
ist, direkt zugreifen (frei nach dem Motto: "Vor Freunden hat man keine
Geheimnisse.").