Statische Funktion versus Funktion im Namespace
-
Hallo,
was ist eigentlich der Unterschied zwischen einer statischen Funktion und einer freien Funktion in einem Namespace? Der generierte Code müsste doch auch identisch sein oder gibt es Fälle, wo sich beides unterscheidet? Bzw. welches Konzept sollte man wann nutzen?
Also zum Beispiel
namespace Math { int add(int,int); }versus "Java-Style"
struct Math { static int add(int,int); //ggf. noch Math() = delete; }In beiden Fällen kann ich im Endergebnis eine Funktion Math::add aufrufen.
Nun habe ich hier oft gelesen (insbes. von manni66, sofern ich ihn richtig verstandnen habe), dass man doch die Namespace-Variante nehmen soll, wenn der struct eigentlich gar nicht als solcher benutzt werden soll. Nun habe ich den CppCon-Talk von John Lakos angeschaut (bzw. überflogen) und er verwendet in seinen Beispielen die struct+static-Variante.
Hat die namespace-Variante irgendwelche Vorteile? Nachteile? Zumindest kann eine Klasse nicht später wieder geöffnet werden und neue Dinge von anderswo hinzugefügt werden, sodass ich den Style struct+static irgendwie klarer finde.
-
Es gibt subtile Unterschiede beim ADL, weil die static-Memberfunktion zur Schnittstelle der Klasse gehört.
static-Memberfunktionen haben, wenn sie denn irgendwie an eine Instanz der Klasse bekommen, volle Zugriffsrechte auf private Member.
Ansonsten ist der Unterschied eher philosophischer Natur. Wenn deine Klasse der Prototyp eines Objekts im Sinne der objektorientierten Programmierung ist, dann nimm eine Klasse; und pack eventuelle statische Eigenschaften dieser Klasse auch in diese. Wenn nicht, dann nimm einen Namespace. Die Math-Klasse ist also ein gutes Beispiel für einen Fall, wo ein Namespace besser wäre, denn es gibt keine Math-Instanzen.
-
wob schrieb:
Nun habe ich hier oft gelesen (insbes. von manni66, sofern ich ihn richtig verstandnen habe), dass man doch die Namespace-Variante nehmen soll, wenn der struct eigentlich gar nicht als solcher benutzt werden soll.
Ja
wob schrieb:
Zumindest kann eine Klasse nicht später wieder geöffnet werden und neue Dinge von anderswo hinzugefügt werden, sodass ich den Style struct+static irgendwie klarer finde.
Naja, das ist wohl subjektiv. Was wäre an std::irgendwas unklar? Wenn aber eine struct nicht nur zwei Zeilen enthält, ist nicht auf den ersten Blick klar, dass es niemals Instanzen davon geben soll.
Eine struct std wäre sicher auch etwas groß.
"using struct std" ist nicht möglich.Eine Funktion kann es auch ohne speziellen Namespace im globalen Namespace :: geben. Warum sollte das Konstrukt anders sein, wenn ich Funktionen irgendwie gruppieren möchte? Genau dazu sind namespaces da.