条款 03:尽可能使用const
const 可以用来修饰指针所指物、指针、引用、函数入参、返回值、STL迭代器等。
一、指针
char st[] = "hello";
char *p = st; //非常量指针,非常量数据
const char *p=st; //非常量指针,常量数据
char * const p = st; //常量指针,非常量数据
const char * const p = st; //常量指针,常量数据,也可写为 char const * const p = st;
二、STL迭代器
迭代器指针是常量
迭代器指向常量
std::vector<int> vec;
....
std::vector<int>::iterator iter = vec.begin();
const std::vector<int>::iterator iter = vec.begin(); //iter 这个指针是常量,相当于 T * const p
*iter = 10; //正确
iter++; //错误
std::vector::const_iterator iter = vec.begin(); //相当于 const T *p
*iter =10; //错误
iter++; //正确
三、在函数声明中的使用
函数返回值使用常量可以避免右值赋值的情况;
类的operator * 函数
class A operator *(const A & A1, const A & A2 );
A a1,a2,a3;
...
(a1*a2)=a3; //a1 a2之间调用了operator*,结果和a3之间调用了operator= ,如果返回类型是内置类型,改动返回值不合法,无法通过编译
const class A operator *(const A & A1, const A & A2 ); //可以避免这种调用
四、const 成员函数
4.1 理解函数为什么要加const修饰

4.2 封装用于非const对象和const对象的接口,接口的调用

4.3 在const 函数中实现类测成员修改

4.4 用const 函数封装非const 函数,static_cast 将非const 转为const , const_cast 将const 对象的const 移除
