我知道只有静态,const和int/enum(pre c ++ 11)的数据成员才能在类声明中初始化."所有其他静态数据成员必须在全局命名空间范围内定义(即在类定义的主体之外),并且只能在这些定义中初始化".
为什么不能在类定义中初始化其他静态数据成员?这是被禁止的具体原因吗?
如果数据成员特定于该类,为什么它们在全局命名空间范围内声明,而不是与其类相关的某些范围?
为什么不能在类定义中初始化其他静态数据成员?这是被禁止的具体原因吗?
很可能是因为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积分成员,因为它允许编译器将它们视为编译时常量.也就是说,您可以使用它们来定义类定义中的数组大小或其他类似位.