为什么静态const char []作为公共类字段是错误的?

dor*_*rge -1 c++ static-members visual-studio-2010 visual-c++

当我将static const char[]我的类作为公共字段添加到我的类时,编译器会给我错误,但是static const int它很好.为什么,我该如何解决?

class example
{
public:
    static const int num2 = 5;// fine
    static const char num[] = "test";// problem
};
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 7

C++语言不支持非整数和非枚举类型的静态成员的类内初始化程序.整数和枚举类型的成员给予特殊处理.您可以在类定义中为它们提供初始化程序.所有其他类型必须在外部定义.

这样做是因为在很大比例的情况下,常量积分值被用作编译时常量,作为程序中的rvalues.它们在实际存储中不需要空间(即不需要物理定义).同时,编译器可以从了解每个转换单元中的积分常量的值中获益(例如,优化,将整数操作数直接嵌入到机器指令中等).这不适用于(或适用于更小程度)非 - 整体类型.

您必须在类之外定义静态成员并在那里提供初始化程序.

class example
{
public:
    static const int num2 = 5;
    static const char num[];
};

const char example::num[] = "test";
Run Code Online (Sandbox Code Playgroud)

请记住,要遵守ODR,成员定义必须放在一个且只有一个实现文件中.不要尝试将其放入头文件中.

  • @dor_torge:这就是语言的定义方式.整数和枚举类型的成员给予特殊处理.您可以在类定义中为它们提供初始化程序.所有其他类型必须在外部定义. (3认同)