荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Dreamer (黄昏·落霞·萤火·街灯), 信区: SoftDev
标  题: 【C++】[FAQ]如何在类中定义常量?
发信站: 荔园晨风BBS站 (Mon Jun 14 14:00:34 2004), 站内信件


A: 如何在类中定义常量?
Q: 如果你想得到一个可用于常量表达式中的常量,例如数组大小的定义,那么你
有两种选择:

class X {
static const int c1 = 7;
enum { c2 = 19 };

char v1[c1];
char v2[c2];

// ...
};
一眼望去,c1的定义似乎更加直截了当,但别忘了只有static的整型或枚举型量才
能如此初始化。这就很有局限性,例如:
class Y {
const int c3 = 7; // error: not static
static int c4 = 7; // error: not const
static const float c5 = 7; // error not integral
};
我还是更喜欢玩“enum戏法”,因为这种定义可移植性好,而且不会引诱我去使用
非标准的“类内初始化”扩展语法。
那么,为何要有这些不方便的限制?因为类通常声明在头文件中,而头文件往往被
许多单元所包含。[所以,类可能会被重复声明。]但是,为了避免链接器设计的复
杂化,C++要求每个对象都只能被定义一次。如果C++允许类内定义要作为对象被存
在内存中的实体,那么这项要求就无法满足了。关于C++设计时的一些折衷,参见
《The Design and Evolution of C++》。

如果这个常量不需要被用于常量表达式,那么你的选择余地就比较大了:

class Z {
static char* p; // initialize in definition
const int i; // initialize in constructor
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; // definition

int f()
{
const int* p1 = &AE::c6; // error: c6 not an lvalue
const int* p2 = &AE::c7; // ok
// ...
}




--

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.223]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店