一、如果被指物是常量,有些程序员会将关键字const写在类型之前,有些人会把它写在类型之后、星号之前。两种写法的意义相同,所以下列两个函数接受的参数类型是一样的:
1 void fl(const Widget* pw);//fl获得一个指针,指向一个常量的(不变的)Widget对象. 2 void f2(Widget const*pw);//f2也是
1 #include <iostream> 2 int main() 3 { 4 using std::cout; 5 char greet[] = "hello"; 6 char pt[] = "你好"; 7 char *const p = greet;//const 在星号右边,表示指针自身是常量 8 char const *q = greet;//const 在星号左边,表示被指物是常量,下同 9 const char *k = greet;//const 在星号左边,表示被指物是常量 10 p = pt;//非法的 11 q = pt;//合法的 12 k = pt;//合法的 13 } 14
二、STL迭代器系以指针为根据塑模出来,所以迭代器的作用就像个T*指针。声明迭代器为const就像声明指针为const一样(即声明一个T* const指针),表示这个迭代器不得指向不同的东西,但它所指的东西的值是可以改动的。如果你希望迭代器所指的东西不可被改动(即希望STL模拟一个const T*指针),你需要的是const_iterator:
1 vector<int> vec;
2 ...
3 const vector<int>::vec.begin(); //liter的作用像个T* const
4 *iter=10; //没问题,改变iter所指物
5 ++iter; //错误!iter是const
6 vector<int>::const_iterator cIter=vec.begin();//cIter的作用像个const T*
7 *cIter=10; //错误!*cIter是const
8 ++cIter; //没问题,可以改变cIter
三、const最具威力的用法是面对函数声明时的应用。在一个函数声明式内,const可以和函数返回值、各参数、函数自身(如果是成员函数)产生关联。将const实施于成员函数的目的,是为了确认该成员函数可作用于const对象身上。这一类成员函数之所以重要,基于两个理由。第一,它们使class接口比较容易被理解。这是因为,得知哪个函数可以改动对象内容而哪个函数不行,很是重要。第二,它们使“操作const对象”成为可能,这对编写高效代码是个关键。