为什么static成员的类型可以是类本身?又为什么非static成员被限定声明为其自身类对象的指针或引用?

提出这两个问题,源于《C++ Primer》中的一句话:“static 数据成员的类型可以是该成员所属的类类型。非 static 成员被限定声明为其自身类对象的指针或引用”

这两个问题的症结一眼可以看出,在于static是属于类而不属于任何一个对象。但仅拿这句话,想要辨析清楚标题中问题的时候,逻辑可能会乱。下面是谭浩强版《C++ 程序设计》296页中的一段话,来辅助解析这个问题:

“如果只声明了类而未定义对象,则类的一般数据成员是不占内存空间的,只有在定义对象时,才为对象的数据成员分配空间。但是静态数据成员不属于某一个对象,在为对象分配的空间中不包括静态数据成员所占的空间。静态数据成员是在所有对象之外单独开辟空间。只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间,他可以被引用。”

根据这段说明,假设声明一个类:

1class Bar { 
2private
3    int a;
4    int b;    
5    static Bar mem1; // ok 
6       };   

在定义一个Bar对象A的时候,因为mem1不属于任何对象,所以A所需的空间只需关注a和b的空间和,是一个固定的可计算值。又因mem1本身是用Bar定义的一个对象,自然它占空间的大小与A相同,只是鉴于static的成员特性,在定义任何对象之前,mem1已经存在于一个单独开辟的空间。

标题中的第二个问题就不同,假设它的类的形式是这样的:

class Bar2 {        
private:            
    int c;           
    int d;               
    Bar2 mem2; // error!        
};   

mem2是非static类型成员,那么使用Bar2在定义对象的时候,首先要知道该类型Bar2需要的空间,也就是说你不知道Bar2的大小,需要计算,于是,你用int+int+Bar2,显然,这其中有一个未知数,编译器计算得不到结果,自然报错。

当“int+int+固定值”的时候,这个问题就得以解决,这时“固定值这个位置”,指针是一个不错的选择,因为指针本身占据4个字节空间,这点与它指向的对象大小无关。至于为什么“引用”也可以,那就需要了解一下“引用的本质”,在谭版《C++ 程序设计》194页有这么一句话:“声明b为a的引用,可以理解为:是变量b具有变量a的地址”,这句话显然是点到为止,并没做更深的探讨。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值