我们在类中声明一个static
变量并在类外部初始化变量,但我们在函数中使用该变量。
有人告诉我原因吗? 在此先感谢
答案 0 :(得分:6)
我不确定,但我的猜测是,因为在一个类成员变量中只声明了。它们通过构造函数或其他成员函数初始化。
实例化对象时会发生这种情况。但是对于静态成员,不需要实例化对象。因此,他们需要在课外进行初始化。
修改强>
实际上没有必要初始化静态变量,但是必须在类外部定义来为它们分配内存。只有在定义之后,才能初始化它们,然后在程序中使用。
答案 1 :(得分:4)
因为静态变量需要在某处分配一些存储空间。
我们以此为例:
struct Example
{
static int counter;
Example() { counter++; }
};
您可以根据需要创建任意数量的Example
个实例,但只会有一个Example::counter
个变量。它基本上是伪装的全局变量。但它应该住在哪里?回到C ++的早期阶段,Stroustrup决定解决这个问题的方法是让你明确地选择一个翻译单元(即.cpp
文件)并在那里声明它,就像你使用“真正的”全局变量一样。所以你需要做一些像
// Only in one .cpp file
int Example::counter = 0;
(当然,后来模板被发明了,弱的符号与它们一起去,这可能解决了这个尴尬的混乱,但那时已经太晚了。)
答案 2 :(得分:1)
静态变量使用标准机制分配在内存的不同部分。
如果使用构造函数在类中初始化它们,那么可能会违反静态变量分配的标准机制。
答案 3 :(得分:1)
由于静态成员在类的所有实例之间共享,因此必须在一个且仅在一个地方定义它们。实际上,它们是具有一些访问限制的全局变量。
如果您尝试在标题中定义它们,它们将在包含该标题的每个模块中定义,并且在链接期间您会发现错误,因为它会找到所有重复的定义。
是的,这至少部分是一个历史问题,可以追溯到cfront;可以编写一个编译器来创建一种隐藏的“static_members_of_everything.cpp”并链接到该编译器。但是,它会破坏向后兼容性,这样做不会有任何实际好处。
答案 4 :(得分:0)
声明仅声明该范围内的变量。 定义实际上会分配内存。
您在类函数中使用它,因为它是在该范围内定义的。静态变量初始化不会在对象创建时发生,而是在应用程序启动时发生。