C ++ donde inicializar const estático

Tengo una clase

class foo { public: foo(); foo( int ); private: static const string s; }; 

¿Dónde está el mejor lugar para inicializar la cadena s en el archivo fuente?

Cualquier lugar en una unidad de comstackción (generalmente un archivo .cpp) haría:

foo.h

 class foo { static const string s; // Can never be initialized here. static const char* cs; // Same with C strings. static const int i = 3; // Integral types can be initialized here (*)... static const int j; // ... OR in cpp. }; 

foo.cpp

 #include "foo.h" const string foo::s = "foo string"; const char* foo::cs = "foo C string"; // No definition for i. (*) const int foo::j = 4; 

(*) De acuerdo con los estándares, debe definir i fuera de la definición de la clase (como j is) si se usa en un código que no sea solo expresiones constantes integrales. Vea el comentario de David a continuación para más detalles.

Los miembros estáticos deben inicializarse en una unidad de traducción .cpp en el scope del archivo o en el espacio de nombre apropiado:

 const string foo::s( "my foo"); 

En una unidad de traducción dentro del mismo espacio de nombres, generalmente en la parte superior:

 // foo.h struct foo { static const std::string s; }; // foo.cpp const std::string foo::s = "thingadongdong"; // this is where it lives // bar.h namespace baz { struct bar { static const float f; }; } // bar.cpp namespace baz { const float bar::f = 3.1415926535; } 

Solo los valores integrales (por ej., static const int ARRAYSIZE ) se inicializan en el archivo de encabezado porque generalmente se utilizan en el encabezado de la clase para definir algo como el tamaño de una matriz. Los valores no integrales se inicializan en el archivo de implementación.

 const string foo::s( "my foo"); 

Y debe inicializarse en el archivo de origen, de lo contrario, se produce un error al invocarlo en el caso de prueba.