分类: C/C++
2007-09-13 11:12:36
C中的const关键字默认是外部连接的,而C++中则是内部连接的,C++中并不给const常量分配存储,而是将它放到一个符号表中。如果const修饰的标识符在编译期间值未知,那么就意味着需要存储空间,也就是说在需要const变量地址的时候,也就是需要分配存储的时候。
Const 也可以定义集合,编译器不能将集合放到符号表中,所以必须分配内存。然而,其值在编译时不能被使用,因为编译器在编译时不需要知道存储的内容。不能够定义一个未知长度的数组。如:
Const int i[]={1,2,3,4}。
Const修饰的指针格式const int * x和int const * x表达的是同一个意思,x是一个指向const的int普通指针。要想使指针成为一个const,必须将const放到*的右边。如int* const x表示指向int的const指针。
有时候在求表达式值期间,编译器必须建立临时对象。像其他任何对象一样,他们需要存储空间而且必须被构造和删除。区别是我们从来看不到它们-----编译器负责它们的去留以及它们存在的细节。它们自动成为常量。
可以在一个声明为const的函数中改变变量的值,这需要对this指针进行强制类型转换,或者在类声明中用mutable关键字指明变量是可以在const函数中改变的。如:
void Y::f() const{
((Y*)this)->j++;
}
或者
class Y{
int I;
mutable int j;
…
}
void Y::f() const {j++;}
volatile的语法与const一样,但是volatile的意思是“在编译器认识的范围外,这个数据可以被改变”。它告诉编译器不要擅自做出有关数据的任何假定---在优化期间这是特别重要的。如果编译器说,已经把数据读进寄存器,而且再没有与寄存器接触。一般情况下,它不需要再读这个数据,但是如果数据是被volatile修饰的,编译器就不能做出这样假定,因为可能被其他进程改变了,它必须重读这个数据而不是优化这个代码。