静态和非静态递归成员之间的差异



C 编程语言书籍提到以下:

在看到结构的完整声明之前,不可能声明结构的新对象。例如

struct No_good {
    No_good member; // error : recursive definition
};

这是一个错误,因为编译器无法确定no_good的大小

但下面的代码正在为我编译。

struct No_good {
    static No_good member; // OK: compiling
};

static如何允许编译器知道member的大小。afaik静态决定命名变量的存储类别。

您在No_good类内无法拥有完整的No_good成员的原因,正如Francois Moisan指出的那样,是因为它会是无限的递归并占用无限的空间。

No_good*成员会没事

静态成员也可以,因为它并未在No_good的每个实例中存储,而是由所有实例共享。从技术上讲,它不是对象的一部分,而是与No_good的名称空间相关的东西。

希望这能清除。

您可以将静态变量视为全局变量。唯一的区别是它在班级的名称空间下。因此,如果它是一个全局变量,则可以像no_good一样达到它,但是如果它是静态的,则必须键入no_good :: no_good。您也可以做到这一点,即使您永远不会实例化班级。

与静态有关的Globals可能会遇到的麻烦。您永远不会知道哪种静态变量首先初始化,如果它们彼此依赖,您仍然遇到麻烦。

我体验它的方式,许多静态用法来自编写C 代码。

最新更新