Chinaunix首页 | 论坛 | 博客
  • 博客访问: 364335
  • 博文数量: 102
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 1116
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-29 16:21
文章分类

全部博文(102)

文章存档

2014年(10)

2011年(1)

2008年(2)

2007年(89)

我的朋友

分类: 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 * xint const * x表达的是同一个意思,x是一个指向constint普通指针。要想使指针成为一个const,必须将const放到*的右边。如int* const x表示指向intconst指针。

 

  有时候在求表达式值期间,编译器必须建立临时对象。像其他任何对象一样,他们需要存储空间而且必须被构造和删除。区别是我们从来看不到它们-----编译器负责它们的去留以及它们存在的细节。它们自动成为常量。

   可以在一个声明为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修饰的,编译器就不能做出这样假定,因为可能被其他进程改变了,它必须重读这个数据而不是优化这个代码。

阅读(1013) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~