web-dev-qa-db-fra.com

const statique contre const statique

Je ne comprends pas la différence entre ces deux instructions dans ma classe C++:

class MyClass {
  public:
  private:
     const static int var = 0;            // Option 1
     static const int var = 0;            // Option 2
};

Quelle est la différence n/b Option 1 et Option 2 ?? Ils compilent tous les deux.

45
BigBrownBear00

Ils signifient exactement la même chose. Vous êtes libre de choisir celui que vous jugez le plus facile à lire.

En C, vous devriez placez static au début, mais ce n'est pas encore requis. Je ne sais pas si C++ a suivi C à cet égard.

6.11.5 Spécificateurs de classe de stockage

1 Le placement d'un spécificateur de classe de stockage autre qu'au début des spécificateurs de déclaration dans une déclaration est une fonction obsolète.

56
user743382

static, const (ici en tout cas) et le type (par exemple int) font tous partie du spécificateur de déclaration. Historiquement, le spécificateur de déclaration était une liste non ordonnée de mots-clés et de noms de type, donc:

static unsigned int const var;
static unsigned const int var;
static int unsigned const var;
static int const unsigned var;
static const unsigned int var;
static const int unsigned var;
unsigned static int const var;
unsigned static const int var;
unsigned int static const var;
unsigned int const static var;
unsigned const static int var;
unsigned const int static var;
int static unsigned const var;
int static const unsigned var;
int unsigned static const var;
int unsigned const static var;
int const static unsigned var;
int const unsigned static var;
const static unsigned int var;
const static int unsigned var;
const unsigned static int var;
const unsigned int static var;
const int static unsigned var;
const int unsigned static var;

étaient tous légaux, et tous signifiaient la même chose.

Je pense que c'est toujours le cas, à la fois en C et en C++, mais si je ne me trompe pas, C a déconseillé de mettre le spécificateur de classe de stockage (static) n'importe où mais au début. C'est en tout cas une convention presque universelle, donc vous devriez normalement mettre static (et extern, etc.) au début.

Notez également qu'être non ordonné ne s'applique qu'au spécificateur de déclaration. Dans les déclarants qui suivent, le ou les qualificatifs cv doivent suivent ce qu'ils qualifient; pour des raisons d'orthogonalité, vous devez normalement toujours mettre les qualificatifs cv après ce qu'ils modifient (c'est-à-dire int const, et pas const int).

Enfin, il semble être une convention répandue de présenter les modificateurs de type avant le type, avec le modificateur de signature (signed ou unsigned) précédant le modificateur de longueur (short, long ou long long). Il est également assez fréquent de supprimer le int si un modificateur est présent, donc les gens écrivent unsigned, plutôt que unsigned int et long, plutôt que long int. Ce n'est cependant pas universel.

Compte tenu de cela, la première façon d'écrire la déclaration, ci-dessus, est préférée, bien qu'il soit tout à fait acceptable de supprimer le int.

35
James Kanze

Ce sont les mêmes. Mais je choisirais toujours l'option 2 pour une simple raison que les mots clés const et int correspondent mieux lorsqu'ils sont juxtaposés car ils définissent le type de données. Alors que le mot clé static définit l'accessibilité de cette variable.

6
Ed Heal
3
nutrina