为什么我们在类中声明静态变量&课外的定义?

时间:2013-12-10 07:32:56

标签: c++

我们在类中声明一个static变量并在类外部初始化变量,但我们在函数中使用该变量。

有人告诉我原因吗? 在此先感谢

5 个答案:

答案 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)

类中的

声明仅声明该范围内的变量。 定义实际上会分配内存。

您在类函数中使用它,因为它是在该范围内定义的。静态变量初始化不会在对象创建时发生,而是在应用程序启动时发生。