2010-10-14 4 views
1

Fondamentalement, si je ne fais pas tous les objets obtenir une copie de toutes les valeurs enum?Cela fait-il une différence si je crée une énumération dans une classe statique?

ps: comme toujours, les références de votre réponse sont toujours les bienvenus ...

+0

Quel est l'avantage de le faire? –

+0

@Andersson: J'aime les garder à portée, et le nom de la classe est souvent le plus approprié. Je suppose que vous ne pouvez pas créer un espace de noms portant le même nom qu'une classe. – nus

Répondre

2

Avec le mot clé enum, vous définissez réellement un type, ne définissant pas le stockage comme un membre de données.

Il est comme la définition d'une classe interne, comme celui-ci:

class X 
    { 
    private: 
     class InnerClass 
     { 
     ... 
     }; 
    }; 

La définition est juste une classe interne définition. Il ne fait que définir le type dans le contexte de la classe externe X, donc InnerClass ne peut être appelé que X :: InnerClass. Mais il ne prend certainement pas de place dans les instances de la classe X.

En ce qui concerne la remarque sur enums: Les valeurs enum sont en fait des entiers, et ces entiers sont utilisés dans le code si nécessaire. Normalement, il n'y a pas de stockage central de toutes les valeurs enum. L'énumération définit simplement un mappage entre un jeton et une valeur numérique et partout où le jeton est utilisé dans votre code, le compilateur le remplace par la valeur numérique.

+0

merci, votre commentaire sur la réponse de GMan est en fait la réponse que je recherchais. Pouvez-vous le copier dans votre réponse, alors je vais en faire la réponse acceptée. – nus

2

Vous ne pouvez pas déclarer un type imbriqué (comme ENUM) statique. Syntaxiquement.

0

Vous ne pouvez pas, cela n'a pas de sens. Chaque instance ne stocke pas les valeurs, elles stockent une valeur provenant des valeurs énumérées.

+0

Cela implique-t-il que tout membre constant n'existera qu'une fois en mémoire, et pas une fois pour chaque instance? – nus

+0

Les valeurs enum sont en réalité des entiers, et ces entiers sont utilisés dans le code si nécessaire. Normalement, il n'y a pas de stockage central de toutes les valeurs enum. L'énumération définit simplement un mappage entre un jeton et une valeur numérique et partout où le jeton est utilisé dans votre code, le compilateur le remplace par la valeur numérique. – Patrick

+0

@ufotds: Oui. C'est juste un type, il n'a pas de stockage. (Un objet de ce type fait.) – GManNickG

0

Les énumérations ne contiennent pas toutes les valeurs possibles. Les différentes valeurs possibles n'existent que dans le code lors de la compilation. Au moment de l'exécution, chaque instance d'une énumération est essentiellement une valeur intégrale.

0

enum {..} s n'occupent pas vraiment d'espace dans votre programme. Seuls les objets déclarés en tant que type énuméré occupent un espace. Même dans ce cas, il est peu probable qu'il y ait plus d'espace que dans un registre de machine (puisqu'ils sont compatibles avec des types entiers).

Le seul endroit où il y aura un stockage associé à tous les noms énumérés et les valeurs définies pour le type est lors de la compilation. Au moment de l'exécution, toutes ces informations sont non uniformes (et ne sont donc pas là).

Questions connexes