为什么必须在定义之外初始化非const,非int/enum静态数据成员?

use*_*112 6 c++ static header

我知道只有静态,const和int/enum(pre c ++ 11)的数据成员才能在类声明中初始化."所有其他静态数据成员必须在全局命名空间范围内定义(即在类定义的主体之外),并且只能在这些定义中初始化".

为什么不能在类定义中初始化其他静态数据成员?这是被禁止的具体原因吗?

如果数据成员特定于该类,为什么它们在全局命名空间范围内声明,而不是与其类相关的某些范围?

Bil*_*eal 5

为什么不能在类定义中初始化其他静态数据成员?这是被禁止的具体原因吗?

很可能是因为C++有单独的翻译单元.编译器需要选择一个目标文件,其中将放置这些符号的初始化逻辑.强制它在特定的源文件中使编译器很容易做出这个决定.

如果数据成员特定于该类,为什么它们在全局命名空间范围内声明,而不是与其类相关的某些范围?

因为这就是C++如何成为班级成员.这与其他类成员(如成员函数)没有什么不同:

头文件:

namespace example {

// Class declared in header
struct some_class
{
    // Member variable
    static float example;
    // Member function
    void DoStuff() const;
};

}
Run Code Online (Sandbox Code Playgroud)

源文件:

namespace example {

    // Implement member variable
    float some_class::example = 3.14159;
    // Implement member function
    void some_class::DoStuff() const
    {
         //....
    }
}
Run Code Online (Sandbox Code Playgroud)

有一个特殊的例外允许在头文件中初始化静态const积分成员,因为它允许编译器将它们视为编译时常量.也就是说,您可以使用它们来定义类定义中的数组大小或其他类似位.