链接:https://www.zhihu.com/question/341035289/answer/1047747826
来源:知乎
————故事1————
class MyClass
{
public:
MyClass object;
//balabala...
};
编译器:这个MyClass类有些什么成员,我看看……
它居然有个MyClass成员对象!
那这个MyClass对象里是不是就也有个MyClass对象?
那这个MyClass对象里的MyClass对象是不是也该有个MyClass对象?
那这个MyClass对象里的MyClass对象里的MyClass对象是不是也该有个MyClass对象?……
编译器:算了算了,报错吧
(当然其实编译器看到第一层套娃的时候就会报错了)
————故事2————
class MyClass
{
public:
MyClass* pointer;
//balabala...
};
编译器:这个MyClass类有些什么成员,我看看……
它有个成员是MyClass的指针!
哦,那我就只用开辟一个能hold住一个指针的内存就行了
指针不就是指向一个地址嘛,一个地址不就相当于一个对应着它自己的整数嘛,要不了几个字节
那这个指针加加减减时到底走多少字节怎么确定呢……
先放着吧,我把整个类定义扫完不就知道MyClass所有成员变量要多少字节了?
嗯,完美!
(类定义中并不能定义自身类的成员对象,但是可以定义指向自身类的指针。)
————故事3————
class MyClass
{
public:
static MyClass object;
char str[22] = "Matryoshka Prohibited";
//balabala...
} foo, bar;
编译器:这个MyClass类有些什么成员,我看看……
它居然有个静态MyClass成员对象!
哦,那就说明这个静态对象是所有MyClass对象都可以用的
既然它是public那么甚至在类外可以用MyClass::object来使用这个静态对象
(如果是private或protected?那无非就是类外不能用嘛,除非你是友元)
但是,没有任何一个MyClass对象是真正拥有这个静态对象的。只是能用。只是可以通过foo.object或者bar.object之类的用它。它自己单独占一块儿内存,任何MyClass对象都不需要为这个静态对象分配内存。
那这个静态对象到底要多少内存呢?
把整个类定义扫完不就知道了?可以的。
还有,这个只能算声明!我还要找找它在哪儿定义!
MyClass MyClass::object; //definition here!
int main()
{
std::cout << MyClass::object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.object.str;
}
哦,找到了,那就可以了。
(编译器扫到main()的时候)
编译器:这个套娃真的是太草了哈哈哈哈……MDZZ。