woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

聚集const成员初始化

“聚集const成员初始化”不是简单const成员初始化。  
  在C++中,可以在变量“定义”时赋初值,比如:  
  int   n=0;  
  对于“聚集”类型如数组和结构,可以使用“聚集常量(Aggregate   literal)”,如:  
  int   a[3]={1,   2,   3};  
  struct   S   {  
      int   a,   b;  
  };  
  struct   S   s={4,   5};  
  聚集常量可以嵌套,如:  
  struct   S   ss[]={   {1,   2},   {3,   4}   };  
  但是不能在变量“声明”时赋初值,比如:  
  struct   ST   {  
      int   a=0;       //   错误,这是一个变量“声明”,不是“定义”  
  };  
  对于static   const“整型”成员,这里的“整型”包括各种整数、字符、bool和enum,C++提供了一个语法便利,可以直接将初值写在“声明”处,而不需要单独的定义。但是对于所有其它类型则不允许这样做,上例改为:  
  struct   ST   {  
      const   static   int   a=0;         //   正确  
      //   const   static   float   f=1.2;     //   错误,只能用于整型成员  
      //   const   static   int   b[3]={1,   2,   3};     //   错误  
  };  
  真正的麻烦之处在于聚集类型的初始化甚至不能放在构造函数的初始化列表里,如:  
  struct   ST   {  
        const   int   b[3];  
        ST()   :   b(   /*   这个地方没法写,C++目前不能把聚集常量当作简单常量处理   */   )  
        {  
              b[0]=1;   b[1]=2;   b[2]=3;       //   错误,因为b被声明为const,这个地方还是没法写  
        }  
  };  
  总之这看起来像是C++语法中的一个小缺陷。  
  虽然这个缺陷可能在后续的C++标准中完善,但是估计短期内没什么希望,一来因为这样做的需求很小,而C++标准委员会眼前有一大堆更重要的问题要处理;二来这样做之后会不会对老程序造成什么兼容向方面的影响尚须广泛测试。  

posted on 2009-02-09 15:30 肥仔 阅读(375) 评论(0)  编辑 收藏 引用 所属分类: C++ 基础


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理