Thinking in C++ Notes 常量

const的变量在预处理阶段处理,并且值不变。

int, bool, char, 指针类型常量会存储在符号表中,并加以优化,即常量折叠(constant folding)

  1. 如定义的两个const变量都是同一个值,其实使用的是符号表中的同一个值。会根据程序使用情况决定是否分配栈内存。
  2. 常量取值为表达式时,将表达式结果存在符号表中,即仅做一次运算。

其他类型(如结构)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

你可能感兴趣的:(Thinking in C++ Notes 常量)