这是前两天脑海中的一个问题,今天突然知道怎么解释了,不知道对不对。
我们知道,向下面这样声明类是不允许的:
- class CDate
- {
- private:
- int year;
- int month;
- int day;
- CDate default_date; .//非法
- };
原因很好理解:假设我们用类CDate定义了一个对象:
- CDate obj;
那么编译器在位对象obj分配存储空间时将陷入一个“死循环”——没办法为数据成员default_date分配空间。
但是,向下面这样是完全可以的,某些时候甚至是必要的:
- class CDate
- {
- private:
- int year;
- int month;
- int day;
- static CDate default_date; //合法
- };
注意,此时default_date是static的。
这时,为什么可以呢?
我们知道,static数据成员是该类所有对象所共有的,内存中只保留一份。
假设有对象声明:
- CDate obj;
此时,编译器在为对象obj分配内存空间时,完全可以置"static CDate default_date"不理,而只为其他三个数据成员year,month,day分配空间。待把这些空间计算分配完毕后,再为所有该类对象共有的default_data分配相同容量的空间。
这样,编译器的工作就完美了。