静态和非静态递归成员之间的区别

时间:2016-12-12 15:05:59

标签: c++ c++11 struct static

C ++编程语言书提到如下:

在看到完整声明之前,无法声明结构的新对象。例如

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

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

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

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

static关键字如何允许编译器知道member的大小。 AFAIK static决定命名变量的存储类。

2 个答案:

答案 0 :(得分:1)

正如Francois Moisan所指出的那样,你不能在No_good类中拥有一个完整的No_good成员是因为它会无限递归并占用无限空间。

No_good*成员可以正常,因为它有一个有限的空间(指针的大小),并且可以为空停止递归。

静态成员也可以,因为它不存储在No_good的每个实例中,而是由所有实例共享。它在技术上不是对象的一部分,而是与No_good

的命名空间相关联的东西

希望这可以解决它。

答案 1 :(得分:0)

您可以将静态变量视为全局变量。唯一的区别是它在类的命名空间下。因此,如果它是一个全局变量,你可以像No_good一样达到它,但如果它是静态的,你必须键入No_good :: No_good。即使你从未实例化过类,你也可以这样做。

你可以通过全局变量获得同样的麻烦。如果它们依赖于彼此仍然存在问题,您永远不会知道哪个静态变量首先初始化。

我体验它的方式,很多静态用法来自于用C观点编写C ++代码。

相关问题