C ++在哪里初始化静态常量

我有一堂课

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

哪里是在源文件中初始化strings的最佳位置?

一个编译单元(通常是.cpp文件)中的任何位置都可以:

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; 

(*)根据标准,如果在代码中使用除了整型常量expression式以外的其他代码,则必须在类定义之外定义i (如j是)。 有关详细信息,请参阅David的评论。

静态成员需要在.cpp翻译单元的文件范围或适当的名称空间中进行初始化:

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

在相同名称空间内的翻译单元中,通常位于顶部:

 // 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; } 

只有整型值(例如static const int ARRAYSIZE )在头文件static const int ARRAYSIZE被初始化,因为它们通常被用在类头中来定义诸如数组大小之类的东西。 非整数值在执行文件中被初始化。

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

它应该在源文件中初始化,否则在testing用例中调用它时会出错。