我如何定义一个类内部(in-class)的常量?


  
如果你需要一个通过常量表达式来定义的常量,例如数组的范围,你有两种选择: 
  
class X { 
    static const int c1 = 7; 
    enum { c2 = 19 }; 
  
    char v1[c1]; 
    char v2[c2]; 
  
    // ... 
}; 
  
乍看起来,c1的声明要更加清晰,但是要注意的是,使用这种类内部的初始化语法的时候,
常量必须是被一个常量表达式初始化的整型或枚举类型,而且必须是static 和const 形
式。这是很严重的限制: 
  
class Y { 
    const int c3 = 7;       // 错误:不是 static 
    static int c4 = 7;      // 错误:不是 const 
    static const float c5 = 7;  // 错误:不是整型 
}; 
  
我倾向使用枚举的方式,因为它更加方便,而且不会诱使我去使用不规范的类内初始化语法。 
  
那么,为什么会存在这种不方便的限制呢?一般来说,类在一个头文件中被声明,而头文件
被包含到许多互相调用的单元去。但是,为了避免复杂的编译器规则,C++要求每一个对象
只有一个单独的定义。如果 C++允许在类内部定义一个和对象一样占据内存的实体的话,这
种规则就被破坏了。对于C++在这个设计上的权衡,请参见《C++语言的设计和演变》。 
  
如果你不需要用常量表达式来初始化它,那么可以获得更大的弹性: 
  
class Z { 
    static char* p;     // 在定义中初始化 
    const int i;        // 在构造函数中初始化 
public: 
    Z(int ii) :i(ii) { } 
}; 
  
char* Z::p = "hello, there"; 
  
你可以获取一个 static成员的地址,当且仅当它有一个类外部的定义的时候: 
  
class AE { 
    // ... 
public: 
    static const int c6 = 7; 
    static const int c7 = 31; 
}; 
  
const int AE::c7;   // 定义 
  
int f() 

    const int* p1 = &AE::c6;    // 错误:c6 没有左值 
    const int* p2 = &AE::c7;    // ok 
    // ... 
}

posted on 2007-03-24 09:46 阿刚 阅读(664) 评论(0)  编辑 收藏 引用


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


导航

<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿(1)

随笔档案

文章档案

C++ BBS

C++ FAQ

C++ WEBSITE

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜