const 指定一个“不被改动”的对象。
如果关键字const出现在星号左边,表示被指物是常量,如果出现在星号右边,表示指针自身是常量, 如果出现在星号两边,表示被指物和指针两者都是常量
- char greeting[] = "Hello";
- char *p = greeting; //non-const pointer,non-const data
- const char *p = greeting; //non-const pointer,const data
- char* const p = greeting; //const pointer,non-const data
- const char * const p = greeting;//const pointer,const data
- void f1(const Widget *pw);
- void f2(Widget const *pw);//这两种形式是一样的
STL迭代器系以指针为根据塑膜出来的,所以迭代器的作用就像个T*指针。声明迭代器额为const就像声明指针为const一样(即声明一个T* const 指针),表示这个迭代器不得指向不同的东西,但它所指向的东西的值是可以改动的。如果你希望迭代器所指的东西不可被改动(即希望STL模拟一个const T*),你需要的是cosnt_iterator:
- std::vector<int> vec;
- //...
- const std::vector<int>::iterator iter = vec.begin();//iter的作用像个
- //T* const
- *iter = 10;//没问题,改变iter所指物
- ++iter;//error! iter是const
- std::vector<int>::const_iterator cIter = vec.begin();//cIter的作用像//个const T*
- *cIter = 10;//error!*cIter是cosnt
- ++cIter;//没问题,改变cIter
const最具威力的用法是面对函数声明时的应用,在一个函数声明式内,const可以和函数返回值,个参数,函数自身产生关联。
令函数返回一个常量往往额可以降低因客户错误而造成的意外,而又不至于放弃安全性和高效性。
- 将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象,函数参数,函数返回类型,成员函数本体。
- 编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”。
- 当const 和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可以避免代码重复。