const表示其所修饰的对象不能够被改变,例如常量,函数,指针等,下面总结一下常见的几条const用法:
1 指针常量与常量指针:这两个概念很容易搞混淆,笔者每次用到这两个概念的时候都要从新查一下文档才放心,查看定义与实例的时候,很容易理解两者的意义与区别,时间一长,概念又模糊了。这里介绍一个简单的记法,这个方法<<Effective C++>>第三版中看到的:
常量指针,即指向常量的指针,故名思议,指针指向的对象是常量,能够改变指针自己的值,不能够改变指针指向的对象的值,定义常量指针的时候,const关键字应出如今星号的左边,例如:函数
int a = 10; int b = 20; int const * p = &a; //常量指针,const在星号左边 *p = 20; //error 不能经过解引用来修改指针指向的对象的值 p = &b; //ok 能够改变指针自己的值
定义常量指针的时候,const既能够出如今类型的左边,也能够出如今类型的右边,例以下面两种写法是等价的:spa
const int * p1; //const在int的左边 int const * p2; //const在int的右边
指针常量,即指针自己是常量,即指针自己的値不能够被改变,但指针指向的对象的值能够改变,定义指针常量的时候,const关键字出如今星号的右边,例如:指针
int a = 10; int b = 20; int * const p = &a; //指针常量,const在星号右边 *p = 20; //ok 指针指向的对象的值能够改变 p = &b; //error 指针自己的值不能够改变
2 声明迭代器为const和const迭代器:声明迭代器为const就像声明指针为const同样,即声明一个T* const指针,表示这个迭代器自己的值不能够改变,不能再指向其它的东西,但其所指向的对象的值是能够改变的。例如:code
const std::vector<int>::iterator iter = vec.begin() iter++; //error *iter = 10; //ok
而若是但愿迭代器所指向的东西不能够被改动,而迭代器自己能够变化即但愿其效果像const T*指针,那么须要一个const迭代器,即const_iterator,例如:对象
std::vector<int>::const_iterator cIter = vec.begin(); cIter++; //ok *cIter = 10; //error
3 const成员函数:const成员函数在声明和定义时都要用const修饰,若是两个成员函数只是由于const属性不一样,这两个函数能够重载,例以下面两个函数能够同时存在于一个类中:文档
string GetName() const; //const成员函数 string GetName(); //non-const成员函数
非const对象既能够调用const成员函数,也能够调用非const成员函数,若是存在上面这种重载的const成员函数和非const成员函数,非const对象会调用非const成员函数;const对象只能够调用const成员函数,由于调用非const成员函数,可能会对其值作修改。string