-
为什么static成员的类型可所以类本身?又为什么非static成员被限制声明为其自身类对象的指针或
添加时间:2013-5-3 点击量:提出这两个题目,源于《C++ Primer》中的一句话:“static 数据成员的类型可所以该成员所属的类类型。非 static 成员被限制声明为其自身类对象的指针或引用”
这两个题目的关键一眼可以看出,在于static是属于类而不属于任何一个对象。但仅拿这句话,想要辨析清楚题目中题目的时辰,逻辑可能会乱。下面是谭浩强版《C++ 法度设计》296页中的一段话,来帮助解析这个题目:
“若是只声了然类而不决义对象,则类的一般数据成员是不占内存空间的,只有在定义对象时,才为对象的数据成员分派空间。然则静态数据成员不属于某一个对象,在为对象分派的空间中不包含静态数据成员所占的空间。静态数据成员是在所有对象之外零丁开辟空间。只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分派空间,他可以被引用。”
按照这段申明,假设声明一个类:
1 class Bar {
2 private:
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的地址”,这句话显然是点到为止,并没做更深的商量。2013-05-03 00:33:05
容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永