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用例中调用它时会出错。