为啥一个类允许拥有自己的静态成员,而不是非静态成员?

Posted

技术标签:

【中文标题】为啥一个类允许拥有自己的静态成员,而不是非静态成员?【英文标题】:Why is a class allowed to have a static member of itself, but not a non-static member?为什么一个类允许拥有自己的静态成员,而不是非静态成员? 【发布时间】:2012-01-21 00:03:34 【问题描述】:
class base 
public:
    base a;
;

它给出了编译错误。

class base 
public:
    static base a;
;

而这段代码没有给出编译错误

【问题讨论】:

结构 a 静态 a b; a::b; @JohannesSchaub-litb 你让我头疼了o_O 狗哥,听说你喜欢上课…… 【参考方案1】:

因为static 类成员不存储在类实例中,这就是static 可以工作的原因。

将一个对象存储在另一个相同类型的对象中会破坏运行时 - 无限大小,对吗?

sizeof 会返回什么?对象的大小需要编译器知道,但由于它包含相同类型的对象,所以没有意义。

【讨论】:

【参考方案2】:

我猜错误是这样的

字段“a”的类型不完整

这是因为当不是静态时,类A 直到右大括号才完全定义。另一方面,静态成员变量在类完全定义后需要一个单独的定义步骤,这就是它们起作用的原因。

搜索声明定义之间的区别以获得更详尽的解释。

【讨论】:

编译器不能为自己“设置提醒”以便稍后“添加”吗?有什么限制? @AssafLevy 对象的大小是多少。 Base 包含一个Base,其中包含一个Base... @JamesKanze:有点像两个互相面对的镜子……明白了,谢谢!

以上是关于为啥一个类允许拥有自己的静态成员,而不是非静态成员?的主要内容,如果未能解决你的问题,请参考以下文章

为啥静态成员函数只能在类定义中声明为静态,而不能在其自己的定义中声明?

静态成员和非静态成员的区别?

一个类不能有自己的静态 constexpr 成员实例吗?

关于静态与非静态之具体总结

java中静态方法和实例方法的区别

为啥我不能只用前向声明 C++ 声明一个类的静态成员?