C++在类中能定义本身类型的成员

链接: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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值