- 如果关键字const出现在*号的左边,被指物是常量。
- 如果关键字const出现在*号右边,表示指针自身是常量。
- 如果关键字const出现在*号两边,被指物和指针都是常量。
char greeting[]="Hello";
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
STL迭代器以指针为根据塑膜出来,所以迭代器的作用就像个T*指针,声明迭代器为const就像声明指针为const一样(T* const),表示这个迭代器不得指向不同的东西,但它所指的东西是可以改动的。如果你希望迭代器所指的东西不可改动(即 const T*),你需要的是const_iterator。
std::vector<int> vec;
const std::vector<int>::iterator iter = vec.begin(); //指针常量
std::vector<int>::const_iterator cIter = vec.begin();//常量指针
将const实施于成员函数的目的是为了确认该成员函数可作用于const对象身上。两个成员函数如果只是常量性不同,可以被重载。
const成员函数调用non-cosnt成员函数是一个错误的行为,因为对象有可能因此而改动。
bitwse const:成员函数只有在不更改对象的任何成员变量时才可以说是const。也就是说它不更改对象内的任何一个bit。不幸的是。许多成员函数虽然不具备const性质,却能通过bitwise测试。一个更改了“指针所指物”的成员函数虽然不能算是const,但如果只有指针隶属于对象,那么称此函数为bitwise const不会引发编译器异议。
1)const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;
2)非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员;
请记住:
- 将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。
- 当conts和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。