Operator<< in C: Friend-Funktion vs. Member-Funktion
In C ist der Operator<< kann entweder als Friend-Funktion oder als Member-Funktion definiert werden. In diesem Artikel werden die Gründe für die Wahl des einen gegenüber dem anderen in bestimmten Szenarien untersucht.
Friend-Function-Ansatz für Operator<<
Bei der Definition von Operator<< Als Friend-Funktion umfasst die Syntax normalerweise Folgendes:
friend bool operator<<(obj const& lhs, obj const& rhs);
Dieser Ansatz wird empfohlen, wenn der Beziehungsvergleich die Untersuchung der privaten Mitglieder der Klasse umfasst. Da Friend-Funktionen Zugriff auf die privaten Mitglieder einer Klasse haben, können sie den Vergleich direkt durchführen.
Member-Function-Ansatz für Operator<<
Bei diesem Ansatz der Operator<< ist als Mitgliedsfunktion der Klasse definiert:
ostream& operator<<(obj const& rhs);
Dieser Ansatz ist geeignet, wenn der Vergleich öffentlich zugängliche Daten oder einfache Operationen umfasst. Es gibt jedoch eine wesentliche Einschränkung: Wenn der Vergleich Zugriff auf private Mitglieder erfordert, kann der Member-Funktions-Ansatz nicht verwendet werden.
Vergleich von Ansätzen
Streaming Operationen:
Beim Definieren des Operators<< Für Streaming-Vorgänge können sowohl Friend-Funktionen als auch Member-Funktionen verwendet werden. Allerdings müssen Friend-Funktionen verwendet werden, wenn der Streaming-Vorgang das Stream-Objekt ändern muss (z. B. Zeilenumbrüche hinzufügen).
Gleichheits- und Beziehungsoperatoren:
Für Operatoren wie = =, !=, <, > usw. werden vorzugsweise als Mitgliedsfunktionen definiert. Dieser Ansatz ermöglicht einen einfachen Vergleich privater Mitglieder innerhalb der Klasse. Darüber hinaus vereinfacht es den Code, da keine zusätzlichen Friend-Funktionen erforderlich sind.
Beispiel
Betrachten Sie das folgende Beispiel einer Paragraph-Klasse mit einer to_str()-Methode:
class Paragraph { public: Paragraph(std::string const& init) : m_para(init) {} std::string const& to_str() const { return m_para; } };
Freundefunktion Ansatz:
friend ostream & operator<<(ostream &os, const Paragraph& p) { return os << p.to_str(); }
Member-Funktion-Ansatz:
ostream & operator<<(ostream &os) { return os << paragraph; }
In diesem Fall wird der Friend-Funktion-Ansatz bevorzugt, da er den Zugriff auf das Private ermöglicht Mitglied m_para für Streaming-Vorgänge.
Das obige ist der detaillierte Inhalt vonFriend-Funktion vs. Member-Funktion für Operator. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!