当const修饰指针时:
首先非常量引用不能指向一个常量对象,
如:
const in ci =104;
int & r1 = ci;//错误的,因为r1是非常量引用,那意思是我改变r1的值就改变常量的值,所以这样是不争取的。
接着常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未作限定。因为对象也可能是个非常量,所以允许通过其他途径改变它的值:如:
int i =42;
int &r1 =i;
const int &r2 = i; //常量引用,r2也绑定 i,但限制通过r2修改i的值的操作
r1 = 0;//r1 非常量,i的值被修改为0,则r2的值也为0,因为常量引用仅仅是限制了操作,通过其他途径可以修改
r2 = 0;//错误 r2常量引用 不能进行改变值的操作
涉及到指针的const
int b=100;
const int *a= &b; [1]
int const *a=&b; [2]
int *const a=&b; [3 ]
const int *const a=&b; [4]
如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量这里就是a的地址为常量,为指向常量的指针;,
因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),不能用于改变其所指对象的值例如,如不能*a=3;指向常量的指针也没有规定所指的对象必须是一个常量,指向常量的指针仅仅要求不能通过指针改变对象的值,没有规定那个对象的值不能通过其他途径改变。
如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量,[3]为指针本身是常量:常量指针,而指针所指向的内容不是常量。这种情况下不能对指针本身更改操作,如a++是错误的,但可以通过对b地址修改;
[4]为指针本身和指向的内容均为常量,所以首先指针本身是常量,存储的地址值也是常量,地址值是不能修改,指针本身也不能操作修改。如下:
int i = 42;
int b = 11;
int const *c = &b; //和 const int *c = &b 一样是指向常量的指针(可以任意指向一个常量或非常量,
//但指针本身不是一个常量),但不能用于修改所指对象的值,因为指向的是一个常量,那么肯定不能操作指针去修改
c = &i; //正确:可以通过给c赋值 i的地址改变c所指向的地址内容
*c = 5; //错误,不能用于修改所指对象的值
int *const h = &b; //常量指针,指针本身是 常量,不能操作指针,如h++,是错误的
h = &i; //错误,因为指针是常量,所以不能操作改变其所对应的地址值,
*h = 5;//正确,可以用于修改所指对象的值,因为没用改变h所指地址值,对h这个常量指针没有影响。
const int *const a = &i;//指针和所指向内容都是常量
cout << c << endl;//指针c存储的地址是00000008BC91F854 动态
cout << a << endl;//指针c存储的地址是00000008BC91F834 动态
a = &b//错误:因为a指针本身是常量,存储的地址值也是常量,所以不能修改地址,也不能操作a修改
*a = 5;//错误,不能用于修改所指对象的值
以上全为自己的理解!