const的变量在预处理阶段处理,并且值不变。
int, bool, char, 指针类型常量会存储在符号表中,并加以优化,即常量折叠(constant folding)。
- 如定义的两个const变量都是同一个值,其实使用的是符号表中的同一个值。会根据程序使用情况决定是否分配栈内存。
- 常量取值为表达式时,将表达式结果存在符号表中,即仅做一次运算。
其他类型(如结构)const变量意味着不能改变的一块存储空间(静态存储区)
更多参考:
- http://stackoverflow.com/questions/5815822/what-happens-with-data-declared-as-const-in-c
- http://www.cppblog.com/xmli/archive/2010/11/23/134425.html
C和C++对于const的定义是很不同的,C中const的意思是:
一个不能被改变的普通变量,const常量总是占用存储,并且名字是全局符。在C++中可以使用extern const int 来达到同样的效果
无论如何,传递一个地址给函数时,尽量使用const来修饰。一个典型的错误就是将临时量传递给一个函数,而这个函数对该临时量进行了修改。这会引发错误,因为表达式被编译过后,临时量将被清除。
构造函数初始化列表,被用于初始化函数执行之前的对象初始化,可用于const属性赋值。形如:
class::foo(args) prop1(value1), prop2(value2), ... {}
这些常量都在预处理阶段, 只有static const可以被看做是编译期间的常量。但是static const在C中是不允许的,可以使用enum hack-匿名enum形如:
enum { size = 200 }
const成员函数的定义,const放在参数列表后面,如 class::foo() const {}
const成员函数的作用:
Declaring a member function with the const keyword specifies that the function is a "read-only" function that does not modify the object for which it is called.
http://msdn.microsoft.com/en-us/library/6ke686zh(v=vs.80).aspx
如何改变const变量? 强制类型转换,如(char*) "text", 或者使用关键字mutable.
volatile和const对应,表示“可变”,对于该变量的读取不使用优化技术(寄存器),而每次都从内存读取,一起被称为c-v限定词。详见:http://stackoverflow.com/questions/4592762/difference-between-const-const-volatile