Ich habe ein objektorientiertes Programmieren mit C ++ Kurs in diesem Semester am College und wir lernten über Freundfunktionen.
Ich mag sie instinktiv nicht, weil sie die Sicherheit umgehen können, die Encapsulation und Data Hiding bieten. Ich habe ein paar Artikel im Internet gelesen und einige Leute dachten, es sei eine gute Idee mit legitimen Verwendungszwecken.
Was würde ein OOPs-Experte über Freundesfunktionen in C ++ sagen? Soll ich nur darüber hinweggehen oder mehr darüber erfahren?
c++
object-oriented
friends
nikhil
quelle
quelle
Antworten:
Es ist nicht immer praktisch, alle Funktionen, die sich auf C ++ - Klassenmitglieder dieser Klasse beziehen, zu erstellen. Stellen Sie sich zum Beispiel eine Implementierung der Vektoralgebra mit Skalarmultiplikation vor. Wir möchten schreiben:
Wir können dies mit einer Mitgliedsfunktion tun:
Wir möchten aber auch schreiben:
Dies erfordert eine freie Funktion:
Das
friend
Schlüsselwort wurde zu C ++ hinzugefügt, um diese Verwendung zu unterstützen. Die freie Funktion ist Teil der Implementierung der Vector-Klasse und sollte im selben Header deklariert und in derselben Quelldatei implementiert werden.In ähnlicher Weise können wir
friend
die Implementierung eng gekoppelter Klassen wie einer Sammlung und eines Iterators vereinfachen. Auch hier würde ich beide Klassen im selben Header deklarieren und sie in derselben Quelldatei implementieren.quelle
inline Vector operator*(double a, Vector v) { return v*a; }
. Canonical Lösung in der Tat.inline Vector operator*(double a, Vector v) { return -v*a; }
und das erfordert immer noch keine Freundschaft.Friend-Funktionen unterscheiden sich hinsichtlich der Kapselung nicht von Member-Funktionen. Sie können jedoch auch andere Vorteile bieten, z. B. generische Vorteile, insbesondere bei Vorlagen. Außerdem können einige Operatoren nur als freie Funktionen angegeben werden. Wenn Sie also möchten, dass sie Mitgliederzugriff haben, müssen Sie dies tun
friend
.Es ist besser für
friend
eine einzelne Funktion, als gezwungen zu sein, etwas zu machen, das nicht öffentlich sein soll. Das heißt, die ganze Welt kann es benutzen - anstatt nur einer Funktion.quelle
friend
eine Funktion, die auch "privat" ist, zB nur in einer einzigen TU deklarieren.Wenn Sie eine Leidenschaft für das haben, was Sie tun, lernen Sie alles über C ++. Erfahren Sie, wofür sie verwendet werden, wie sie verwendet werden, und entscheiden Sie sich dann - und nur dann -, sie nicht zu verwenden. Zumindest sind Sie darauf vorbereitet, den Code eines anderen Benutzers zu lesen, der diese Facette von C ++ verwendet.
quelle
" Was würde ein OOPs-Experte sagen ... " Es hängt hauptsächlich davon ab, wie gut er mit C ++ vertraut ist, dass es sich - seiner eigenen Spezifikation nach - nicht um eine Sprache für Puristen handelt (und dies auch nicht sein möchte).
OOP Zealots verwenden kein C ++ (sie bevorzugen Smalltalk und Java).
Zelots mit funktionaler Programmierung verwenden kein C ++ (sie bevorzugen LISP und seine Nachfolger)
Die meisten OOP-Experten mögen keine Friend-Funktion, nur weil sie möchten, dass sich der OOP-Teil von C ++ wie Smalltalk verhält. Aber C ++ ist kein Smalltalk und sie können nicht einmal verstehen, dass Friend die Kapselung nicht unterbricht , aus dem einfachen Grund, dass eine Funktion nicht mit Ihrer Klasse befreundet sein kann, ohne dass Ihre Klasse dies wünscht .
Und vom Standpunkt der "Funktionalität" gibt es keinen Unterschied zwischen
a.fn(b)
undfn(a,b)
(wofn
ist ein Freund): Die beteiligten Parteien sind die gleichen. Eine Syntax ist möglicherweise besser geeignet als eine andere: Wenn fn kommutativ in Bezug aufa
und istb
,fn(a,b)
ist sie wahrscheinlich besser geeigneta.fn(b)
(wenn ein Look eine "besondere Rolle" hat, die es in der Tat nicht hat).quelle
quelle
Die C ++ - FAQ sind kurz gefasst:
Die FAQ bietet eine der nützlichsten Denkweisen über Freundschaft:
Möglicherweise ist die häufigste Verwendung von Friend-Funktionen das Überladen von << für E / A.
quelle
Friend-Funktionen werden am besten für benutzerdefinierte Operatordefinitionen verwendet. Sie sind in anderen Situationen hilfreich. Wenn Sie jedoch feststellen, dass Sie häufig Freundesklassen angeben, befinden Sie sich möglicherweise auf einem Umweg über das Design (nur eine gute Selbstprüfung, die Sie beim Schreiben von Code verwenden sollten).
Seien Sie vorsichtig mit der "Sicherheitserklärung" in der ursprünglichen Frage. Zugriffsmodifikatoren verhindern, dass Sie versehentlich fehlerhaften Code schreiben, genau wie der Compiler in gewisser Weise. Zugriffsmodifizierer begrenzen die Schnittstelle und dienen dazu, zu kommunizieren, welche Funktionen für die Verwendung der Klasse wichtig sind (öffentlich und geschützt) und welche Funktionen erstellt wurden, um die Klasse für die Betreuer (privat) hübscher zu gestalten. Modifikatoren stellen keine Sicherheit dar, da es viele Möglichkeiten gibt, an private Daten zu gelangen. Holen Sie sich zum Beispiel einen Zeiger auf die Klasse und ihre Größe und gehen Sie angeln.
quelle
C ++ - Friend-Funktionen stehen in engem Zusammenhang mit der folgenden Funktionalität:
Dies bedeutet, dass sie diesen Zeiger nicht haben und sich somit außerhalb der Klasse / des Objekts befinden. Andererseits nehmen sie oft Parameter, die sie wieder zur Klasse gehören lassen. Hier ist ein Beispiel, das den Zusammenhang verdeutlicht:
Der einzige Unterschied zwischen statischen Funktionen und Friend-Funktionen besteht darin, dass eine Friend-Funktion mehrere Klassen verwenden kann.
Die Verwendung des Friend-Mechanismus in c ++ erfordert Programmierer, die ungefähr 10-15 Jahre Erfahrung mit der Programmierweise in c ++ haben. Daher sollten Sie dies zunächst vermeiden. Es ist erweiterte Funktion.
quelle