const 指定一个“不被改动”的对象。

  1. char greeting[] = "Hello"
  2. char *p = greeting;         //non-const pointer,non-const data 
  3. const char *p = greeting;   //non-const pointer,const data 
  4. charconst p = greeting;   //const pointer,non-const data 
  5. const char * const p = greeting;//const pointer,const data 
如果关键字const出现在星号左边,表示被指物是常量,如果出现在星号右边,表示指针自身是常量, 如果出现在星号两边,表示被指物和指针两者都是常量
  1. void f1(const Widget *pw);  
  2. void f2(Widget const *pw);//这两种形式是一样的 

 STL迭代器系以指针为根据塑膜出来的,所以迭代器的作用就像个T*指针。声明迭代器额为const就像声明指针为const一样(即声明一个T* const 指针),表示这个迭代器不得指向不同的东西,但它所指向的东西的值是可以改动的。如果你希望迭代器所指的东西不可被改动(即希望STL模拟一个const T*),你需要的是cosnt_iterator:

  1. std::vector<int> vec; 
  2. //... 
  3. const std::vector<int>::iterator iter = vec.begin();//iter的作用像个 
  4. //T* const 
  5. *iter = 10;//没问题,改变iter所指物 
  6. ++iter;//error! iter是const 
  7.  
  8. std::vector<int>::const_iterator cIter = vec.begin();//cIter的作用像//个const T* 
  9. *cIter = 10;//error!*cIter是cosnt 
  10. ++cIter;//没问题,改变cIter 

 const最具威力的用法是面对函数声明时的应用,在一个函数声明式内,const可以和函数返回值,个参数,函数自身产生关联。

令函数返回一个常量往往额可以降低因客户错误而造成的意外,而又不至于放弃安全性和高效性。

 

  1. 将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象,函数参数,函数返回类型,成员函数本体。
  2. 编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”。
  3. 当const 和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可以避免代码重复。