现在的位置: 首页 > 综合 > 正文

C++中 为何允许类本身的静态对象作为其数据成员

2013年05月21日 ⁄ 综合 ⁄ 共 772字 ⁄ 字号 评论关闭

 这是前两天脑海中的一个问题,今天突然知道怎么解释了,不知道对不对。        

 我们知道,向下面这样声明类是不允许的:

Code:
  1. class CDate  
  2. {  
  3.     private:  
  4.         int year;  
  5.         int month;  
  6.         int day;  
  7.           
  8.         CDate default_date;    .//非法  
  9. };  
  10.           
  11.            

原因很好理解:假设我们用类CDate定义了一个对象:

Code:
  1. CDate   obj;  

那么编译器在位对象obj分配存储空间时将陷入一个“死循环”——没办法为数据成员default_date分配空间。

但是,向下面这样是完全可以的,某些时候甚至是必要的:

Code:
  1. class CDate  
  2. {  
  3.     private:  
  4.         int year;  
  5.         int month;  
  6.         int day;  
  7.           
  8.         static CDate default_date;  //合法   
  9. };  
  10.           
  11.            

注意,此时default_date是static的。

这时,为什么可以呢?

我们知道,static数据成员是该类所有对象所共有的,内存中只保留一份。

假设有对象声明:

Code:
  1. CDate    obj;  

此时,编译器在为对象obj分配内存空间时,完全可以置"static   CDate   default_date"不理,而只为其他三个数据成员year,month,day分配空间。待把这些空间计算分配完毕后,再为所有该类对象共有的default_data分配相同容量的空间。

这样,编译器的工作就完美了。

抱歉!评论已关闭.