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

时间:2014-08-19 16:42:22

标签: c++ visual-studio-2010 visual-c++ static-members

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

class example
{
public:
    static const int num2 = 5;// fine
    static const char num[] = "test";// problem
};

1 个答案:

答案 0 :(得分:7)

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

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

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

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

const char example::num[] = "test";

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