常量
起初读者可能认为合乎逻辑的选择是把一个const放在类里,但这不会产生预期的结果。在一个类里,const 恢复它在C中的一部分意思。
它在每个类对象里分配存储并代表一个值,这个值一旦被初始化以后就不能改变。在一个类里使用const的意思是“在这个对象声明期内,这个是一个常量”。
然而,对这个常量来讲,每个不同的对象可以含一个不同的值。
把一个内部数据类型封装在一个类里以保证用构造函数初始化,是很用的。
例如
class interger{int i;public:interger(int I = 0);};integer::integer(int I):i(I){};
现在,如果建立一个integer数组,他们都被自动初始化为零。
interger[100]; 与for循环和memset()相比,这种初始化不必付出更多哦的开销。很多编译器可以很容易地把他优化成一个很快的过程。
因为在类对象里进行了存储空间分配,编译器不能知道const的内容是什么,所以不能把它用作编译期间的常量。
class bunch{enum {size = 100};int i[size];};
使用enum是不会占用对象中的存储空间的,枚举常量在编译时被全部求值。
const对象和成员函数
const blob B(2);
由于编译器强调对象为const,因此它必须保证对象的数据成员在对象的寿命期内不能被改变。可以很容易地保证公有数据不能被改变,但是怎么知道哪个成员函数会改变数据,又怎么知道哪个成员函数对与const对象是“安全”的呢
如果声明一个成员函数为const函数,则等于告诉编译器可以为一个const对象调用这个函数。一个没有特别声明为const的成员函数被看成是将要修改对象中数据成员的函数,而且编译器不允许为一个const对象调用这个函数。
必须在定义和声明中加入const.
如果一个对象被定义成一个const对象,它就被放进只读存储器(ROM)中的一个候选,在头文件里,内联函数默认为内部连接--即它是static,并且只能在它被包含的编译单元看到。因此,只要他们不在相同的编译单元中声明,在内联函数和全局函数之间用同样的名字也不会在链接时产生冲突。