Private Mitglieder: Statisch const vs. nur const

8

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.

  1. Statische Konstanten
  2. Const Mitglieder

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.

    
trikker 21.12.2009, 00:01
quelle

5 Antworten

15

"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.

    
AnT 21.12.2009, 00:06
quelle
14

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.

    
Dustin 21.12.2009 00:07
quelle
1

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.

    
Jeremy Friesner 21.12.2009 00:07
quelle
0

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.

    
DanDan 21.12.2009 00:08
quelle
0

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%     
Raymond Tay 21.12.2009 00:47
quelle

Tags und Links