Freie Funktion versus Memberfunktion

Lesezeit: 4 Minuten

Freie Funktion versus Memberfunktion
Jana

Was ist der Vorteil einer freien Funktion (im anonymen Namensraum und nur in einer einzigen Quelldatei zugänglich) und das Senden aller Variablen als Parameter im Gegensatz zu einer privaten Klassenmitgliedsfunktion ohne Parameter und direktem Zugriff auf Mitgliedsvariablen?

Header:

 Class A {
    int myVariable;
    void DoSomething() {
       myVariable = 1;
    }
 };

Quelle:

 namespace {
    void DoSomething2(int &a) {
        a = 1;
    }
 }

 int A::SomeFunction() {
    DoSomething2(myVariable); // calling free function
    DoSomething(); // calling member function
 }

Wenn Sie es vorziehen, sie zu Mitgliedern zu machen, was ist, wenn ich einen Fall habe, in dem ich zuerst eine Funktion aufrufe, die auf keine Mitgliedsvariablen zugreift, diese Funktion jedoch eine andere Funktion aufruft, die ist Zugriff auf ein Mitglied. Sollen beide Mitgliedsfunktionen oder kostenlos sein?

  • Kannst du wenigstens Code schreiben, der versucht kompilieren?

    – Schuh

    9. Januar ’14 um 19:00


  • @StephaneRolland nein, dieser Link betrifft die öffentliche Schnittstelle, nicht die Implementierung

    – TemplateRex

    9. Januar ’14 um 19:02

  • @TemplateRex lass mich darauf bestehen, dass es darum geht, Memberfunktionen zu verwenden oder nicht. Lassen Sie mich die Antwort zitieren, die besagt: “Indem es viele, viele Methoden gibt, die direkt von den Interna der Klasse abhängen, bedeutet die kleinste Änderung eine vollständige Neuschreibung. Es muss nicht so sein.”

    – Stephane Rolland

    9. Januar ’14 um 19:05

  • @StephaneRolland Ihre Punkte werden sehr geschätzt, aber sie beziehen sich alle auf Schnittstellen, nicht auf Implementierungen. Einige der Vorteile sind jedoch die gleichen, weniger Neukompilierung.

    – TemplateRex

    9. Januar ’14 um 19:12

  • @TemplateRex Ein weiterer Vorteil kann darin bestehen, dass eine Klasse etwas kleiner ist. Aber ich verstehe jetzt, warum Sie mich auf die Umsetzungsseite konzentrieren.

    – Stephane Rolland

    9. Januar ’14 um 19:18

1641866405 871 Freie Funktion versus Memberfunktion
Stephane Rolland

siehe diese Frage: Effektives C++ Item 23 Bevorzugen Sie Nicht-Member-Nicht-Freund-Funktionen gegenüber Member-Funktionen und auch C++-Member-Funktionen gegenüber freien Funktionen

Freie Funktionen sollten Sie insofern bevorzugen, als sie die lose Kopplung fördern.

Ziehen Sie in Erwägung, es nur dann zu einer Memberfunktion zu machen, wenn es funktioniert auf den Mut deiner Klasse, und dass Sie es für wirklich sehr eng mit Ihrer Klasse verbunden halten.

Es ist ein Punkt des Buches 101 C++-Codierungsstandards, die besagt, dass freie Funktionen und statische Funktionen gegenüber Memberfunktionen bevorzugt werden.

Obwohl dies als meinungsbasiert angesehen werden kann, ermöglicht es, den Unterricht gering zu halten und Bedenken zu trennen.

Diese Antwort lautet: “Der Grund für diese Regel ist, dass Sie sich durch die Verwendung von Memberfunktionen versehentlich zu sehr auf die Interna einer Klasse verlassen können.”

  • Ist das Problem mit Mitgliedsfunktionen nicht, dass sie den Zustand von Variablen oder Zeigern darin nicht behalten? Ich meine, wenn die freie Funktion terminiert, tun das auch alle Zeiger und Variablen, die Sie in der Memberfunktion deklariert haben …

    – Igor Ganapolsky

    27. Juni ’16 um 15:38

  • Ich bin mir nicht sicher, ob ich verstehe, was du meinst. Ich würde Ihren Satz so korrigieren und nach meinem Verständnis neu formulieren: Es gibt nicht viele Unterschiede zwischen einer freien Funktion und einer Methode. Wir könnten vereinfachen und sagen, dass Methoden einfach Zugriff auf einen anderen Eingabeparameter haben, der aufgerufen wird this, und die implizit übergeben wird und innerhalb der Methode zugänglich ist. Eine Methode hat ABSOLUT kein anderes Verhalten als freie Funktionen bezüglich des Lebensumfangs lokaler Variablen und Zeiger.

    – Stephane Rolland

    27. Juni ’16 um 16:30

Freie Funktion versus Memberfunktion
VorlageRex

Ein Vorteil einer Nicht-Member-Funktion in einer Quelldatei ähnelt den Vorteilen der Pimpl-Idiom: Clients, die Ihre Header verwenden, müssen nicht neu kompiliert werden, wenn Sie Ihre Implementierung ändern.

// widget.h
class Widget 
{
public:
    void meh();
private:
    int bla_;
};

// widget.cpp
namespace {
    void helper(Widget* w) // clients will never know about this
    { /* yadayada */ }
}

void widget::meh() 
{ helper(this); }

Natürlich, wenn es so geschrieben wird, helper() kann nur die öffentliche Schnittstelle von . verwenden Widget, also gewinnen Sie wenig. Sie können ein friend Erklärung für helper() Innerhalb Widget aber irgendwann steigst du besser auf eine ausgewachsene Pimpl-Lösung um.

1641866405 959 Freie Funktion versus Memberfunktion
Mark B

Der Hauptvorteil von freien Funktionen gegenüber Memberfunktionen besteht darin, dass sie die Schnittstelle von der Implementierung entkoppeln. Beispielsweise, std::sort muss es nicht wissen irgendetwas über den zugrunde liegenden Container, auf dem es arbeitet, nur dass ihm Zugriff auf einen Container (durch Iteratoren) gewährt wird, der bestimmte Eigenschaften bereitstellt.

In deinem Beispiel die DoSomething2 -Methode trägt nicht viel dazu bei, die Kopplung zu verringern, da sie immer noch auf das private Member zugreifen muss, indem sie als Referenz übergeben wird. Es ist mit ziemlicher Sicherheit offensichtlicher, die Zustandsmutation einfach in der Ebene durchzuführen DoSomething Methode statt.

Wenn Sie eine Aufgabe oder einen Algorithmus in Bezug auf die öffentliche Schnittstelle einer Klasse implementieren können, ist dies ein guter Kandidat für die Erstellung einer freien Funktion. Scott Meyers fasst hier ein vernünftiges Regelwerk zusammen: http://cpptips.com/nmemfunc_encap

.

348840cookie-checkFreie Funktion versus Memberfunktion

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy