Ich versuche zu entscheiden, was die beste Option wäre, wenn ein Objekt Eigenschaften hat, die sich nicht ändern und die in allen Funktionen benötigt werden.
Es scheint mir, als ob der wahre Grund für ein statisches Element darin besteht, eine Variable zu haben, die geändert werden kann und somit alle anderen Objekte derselben Klasse betrifft. Ich habe jedoch Leute haben empfohlen, Klasse "Invarianten" als statisch const Mitglieder zu sein. Ich bin auf der Suche nach einem Einblick in den empfohlenen Ansatz zur Erstellung von Klassenkonstanten und warum.
"Wird nicht geändert" ist nicht präzise genug. Die Hauptfrage ist hier, ob verschiedene Objekte der Klasse unterschiedliche Werte dieser Konstanten haben müssen (auch wenn sie sich während der Lebensdauer des Objekts nicht ändern) oder alle Objekte denselben Wert verwenden (teilen) sollen.
Wenn der Wert für alle Objekte der Klasse gleich ist, dann sollte es natürlich ein static const
Mitglied der Klasse sein.
Wenn verschiedene Objekte unterschiedliche Werte benötigen, sollte es nur ein nicht statisches const
-Member sein.
Ein Element const
sollte verwendet werden, wenn dieses Mitglied nicht pro Instanz geändert wird. Ein Mitglied static const
sollte verwendet werden, wenn dieses Mitglied nicht pro Klasse geändert wird. Mit anderen Worten, egal wie viele Instanzen Sie erstellen, das static const
-Member bleibt zwischen allen Instanzen fest, während das const
-Member nur für eine bestimmte Instanz konstant ist.
Ich bin mir nicht sicher, ob Sie das suchen, denn das ist nur eine Erklärung dafür, wie sie sich verhalten, aber ich hoffe, es hilft etwas.
Ein Grund wäre, dass reguläre const-Member mehr Speicher belegen würden ... d. h. für jedes Objekt der Klasse, die Sie erstellen, wird ein const-Member-Objekt in dieses Objekt eingeschlossen und initialisiert.
Wenn es andererseits ein statisches const-Element ist, dann wird nur ein Objekt erstellt und initialisiert, egal wie viele Objekte der Klasse, die Sie erstellen, und alle Klassenobjekte teilen das gleiche Objekt.
Um dies zu demonstrieren, versuchen Sie es in beide Richtungen zu kompilieren, erstellen Sie mehrere Objekte und machen Sie einen printf ("% p", & amp; theConstMemberObject) ... wenn es statisch ist, sehen Sie alle denselben Zeigerwert; wenn es nicht statisch ist, haben sie jeweils ihr eigenes Objekt und so drucken sie jeweils einen anderen Zeigerwert.
Sie würden eine Membervariable statisch const machen, da Sie, wenn sie sich nicht ändert, dieselbe Kopie von ihr verwenden können, die von allen Instanzen Ihrer Klasse gemeinsam genutzt wird. Im Gegensatz zu jeder Instanz, die ihre eigene (identische) Kopie des konstanten Wertes hat.
Sie würden erwarten, dass der Compiler schlau genug ist, um diese Optimierung für Sie durchzuführen, und ich vermute, dass dies der Fall ist. Es ist eine nette Angewohnheit, in sie hineinzukommen.
Ich bevorzuge es, static const
members zu verwenden, da es immer so aussieht, als würde es mehr Kopplung erzeugen als const
members; manchmal Verwirrung in der Diamant-Vererbungshierarchie, wo die letzte Klasse von 2 Superklassen erbt (1 Klasse wird geerbt public
; die andere wird virtual public
geerbt) und dann ein static const
-Member definiert, das über new
auf eine dynamische Speicherregion verweist , malloc
, calloc
usw. würde zu einem double free
Fehler führen.
z.B. Hier ist die Ausgabe einer einfachen Diamantvererbungssituation
%Vor%Hier ist der Code:
%Vor%Tags und Links c++