Comment initialiser un membre const statique en C++?

est-il possible d'initialiser une valeur de const statique en dehors du constructeur? Peut-elle être initialisée au même endroit où se trouvent les déclarations des membres?

class A {
private:
  static const int a = 4;
  /*...*/
};
48
demandé sur jogojapan 2010-08-20 17:06:34

4 réponses

oui vous pouvez mais seulement pour les types int. Si vous voulez que votre participant statique soit un autre type, vous devrez le définir quelque part dans un fichier RPC.

class A{
private:
 static const int a = 4; // valid
 static const std::string t ; // can't be initialized here
 ...
 ...
};


// in a cpp file where the static variable will exist 
const std::string A::t = "this way it works";

notez aussi que cette règle a été supprimée dans C++11, Maintenant (avec un compilateur fournissant la fonctionnalité) vous pouvez initialiser ce que vous voulez directement dans la déclaration de membre de classe.

57
répondu Klaim 2012-01-28 11:38:12

membres de données statiques (c++ seulement)

La déclaration d'une donnée membre statique dans la liste des membres d'une classe n'est pas une définition. Vous devez définir le membre statique en dehors de la déclaration de classe, dans namespace scope. Par exemple:

class X
{
public:
      static int i;
};
int X::i = 0; // definition outside class declaration

une fois que vous avez défini un membre de données statiques, il existe même si aucun objet de la classe du membre de données statiques n'existe. Dans l'exemple ci-dessus, aucun objet de la classe X n'existe même si le membre de données statiques X:: i a été définis.

données statiques les membres D'une classe dans namespace scope ont un lien externe. L'initialiseur, pour une donnée membre statique est dans la portée de la classe déclarant le membre.

un élément de données statique peut être de n'importe quel type sauf pour le vide ou le vide qualifié avec const ou volatile. Vous ne pouvez pas déclarer une donnée membre statique comme mutables.

Vous ne pouvez avoir qu'une seule définition d'un membre statique dans un programme. Classes sans nom, classes contenues dans les classes sans nom les classes et les classes locales ne peuvent pas avoir des données membres statiques.

données statiques les membres et leurs initialisateurs peuvent accéder à d'autres membres statiques privés et protégés de leur classe. L'exemple suivant montre comment vous pouvez initialiser les membres statiques à l'aide d'autres membres statiques, même si ces membres sont privés:

class C {
      static int i;
      static int j;
      static int k;
      static int l;
      static int m;
      static int n;
      static int p;
      static int q;
      static int r;
      static int s;
      static int f() { return 0; }
      int a;
public:
      C() { a = 0; }
      };

C c;
int C::i = C::f();    // initialize with static member function
int C::j = C::i;      // initialize with another static data member
int C::k = c.f();     // initialize with member function from an object
int C::l = c.j;       // initialize with data member from an object
int C::s = c.a;       // initialize with nonstatic data member
int C::r = 1;         // initialize with a constant value

class Y : private C {} y;

int C::m = Y::f();
int C::n = Y::r;
int C::p = y.r;       // error
int C::q = y.f();     // error

les initialisations de C:: p et C:: q causent des erreurs parce que y est un objet d'une classe qui est dérivé en privé de C, et ses membres ne sont pas accessible aux membres de C.

si un membre de données statiques est de type const integral ou const enumeration, vous pouvez spécifier un initialiseur constant dans la déclaration du membre de données statiques. Cet initialiseur constant doit être une expression constante intégrale. Notez que la constante d'initialiseur n'est pas une définition. Vous avez encore besoin de définir le membre statique dans un espace de noms. L'exemple suivant le démontre:

#include <iostream>
using namespace std;

struct X {
  static const int a = 76;
};

const int X::a;

int main() {
  cout << X::a << endl;
}

les jetons = 76 à la fin du déclaration de données statiques l'élément a est un initialiseur constant.

28
répondu 2010-08-20 13:11:00

juste par souci d'exhaustivité, j'ajoute à propos des variables membres statiques de template.

template<class T> struct X{
   static T x;
};

template<class T> T X<T>::x = T();

int main(){
   X<int> x;
}
10
répondu Chubsdad 2010-08-20 13:52:42

vous ne pouvez pas initialiser les membres statiques dans les constructeurs. Les types intégraux que vous pouvez initialiser en ligne à leur déclaration. Les autres éléments statiques doivent être définis (dans un .cpp fichier:

// .h
class A{
private:
 static const int a = 4;
 static const foo bar;
 ...
 ...
};

// .cpp
const foo A::bar = ...;
3
répondu sbi 2010-08-20 13:12:18