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决定命名变量的存储类。
答案 0 :(得分:1)
正如Francois Moisan所指出的那样,你不能在No_good
类中拥有一个完整的No_good
成员是因为它会无限递归并占用无限空间。
No_good*
成员可以正常,因为它有一个有限的空间(指针的大小),并且可以为空停止递归。
静态成员也可以,因为它不存储在No_good
的每个实例中,而是由所有实例共享。它在技术上不是对象的一部分,而是与No_good
。
希望这可以解决它。
答案 1 :(得分:0)
您可以将静态变量视为全局变量。唯一的区别是它在类的命名空间下。因此,如果它是一个全局变量,你可以像No_good一样达到它,但如果它是静态的,你必须键入No_good :: No_good。即使你从未实例化过类,你也可以这样做。
你可以通过全局变量获得同样的麻烦。如果它们依赖于彼此仍然存在问题,您永远不会知道哪个静态变量首先初始化。
我体验它的方式,很多静态用法来自于用C观点编写C ++代码。