Der Dereferenzierungsoperator funktioniert genauso wie ein überladener Operator, da es wie ein gewöhnlicher Bediener tut.
int foo(int *p)
{
return *p;
}
In der Erklärung return *p;
gilt der Dereferenzierungsoperator auf den Zeiger p
. Es wird ihm auf der rechten Seite übergeben:
Als überlasteten Operator funktioniert es auf die gleiche Weise.
class bar {
int *some_internal_ptr;
public:
int operator*() const {
return *some_internal_ptr;
}
// Other class members and methods...
};
int foo(bar p)
{
return *p;
}
Wenn die rechte Seite der *
Operatorklasse mit einem Operator * `Mitglied ist, es wird als eine überladene Methode der Klasse aufgerufen, nicht anders als jedes andere Mitglied, um das dereferenzieren zu lösen .
Es ist, weil die Verwendung identisch ist, warum viele C++ - Bibliotheksalgorithmen mit Zeigern oder C++ - Bibliotheksoperatoren gleich gut funktionieren. Zum Beispiel std::copy()
konnte wie folgt implementiert werden (ich Trimmen einige irrelevant Komplexität weg, die nicht hier ist Germane):
template<typename iter_type>
iter_type copy(iter_type b, iter_type e, iter_type t)
{
while (b != e)
{
*t=*b;
++t;
++b;
}
return t;
}
Sie nativen Zeiger auf std::copy
passieren können, oder Klassen wie Iteratoren passieren, mit überlastet *
Operatoren, und weil ein überladener Operator *
mit der gleichen Syntax wie ein gewöhnlicher Operator *
verwendet wird, funktioniert derselbe Algorithmus auch mit dem überladenen Operator.
ich keine zuverlässige Quelle gefunden, die besagen, dass ein überlasteter unäre Operator-Member-Funktion würde rechten Operanden als ein implizites Argument nehmen, falls erforderlich. – sushrut619
Es ist ein unärer Operator, es funktioniert auf den Wert folgt – Danh
Als eine zusätzliche Frage würde es einen Unterschied in wie der überladene * Operator verwendet wird, wenn es als eine Nicht-Member-Funktion vs eine Member-Funktion definiert ist? – sushrut619