const的作用:(1)普通变量的保护;(2)地址空间的保护;(3)类初始变量的声明和保护;(4)类变量在函数中的保护。const的保护主要来自于编译器层面,和程序的运行没有关系。
const:1)对象一旦创建就不能改变,所以必须初始化。
2)只在一个文件中定义const,在其他多个文件中声明并使用。
3)常量引用:const int i=20; int j=10;
const int &r=i;// i,r值都不可变 const int &r=j; //r的值不可变,可以通过改变j来改变r的值
int &r=i;//错误,试图通过引用r修改I int&r=j; //普通引用
4)指针常量&常量指针:const int* p 被指对象是const;p2c int *const p 指针是常量 地址不变 对象可变 c2p
double pi=3.14;const double *i=π double *const j=π
*i=10; //错误 被指对象是const *j=10; //正确
i=j; //正确 j=i; //错误 指针为常量 不能改变地址
5)顶层const&底层const:顶层常量可以表示任意的对象是常量,底层常量与指针和引用相关,顶层表示指针本身,底层表示对象。执行拷贝时,2个对象顶层通常没有影响,但是底层限制必须一致。
int i=0; int *const p1=&i; const int c=42; const int *p2=&c; const int *const p3=&p2; const int &r=c;
i=c; p2=p3; // 正确;
int *p=p3; int&r=c; //错误 底层不一致
p2=p3; p2=&i; //正确
6)const 成员函数:char get() const; 只需要在成员函数参数列表后加上关键字const
int error(intival) const { _cursor = ival; } //错误 const成员函数不允许修改类的数据成员
void setName(const string &s) const { *pName=s.str(); }
但是,如果据成员是指针,则const成员函数并不能保证不修改指针指向的对象
(1)const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;
(2)非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员;
(3)作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应心可能将该成员函数声明为const 成员函数。