一、如果被指物是常量,有些程序员会将关键字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对象”成为可能,这对编写高效代码是个关键。