C++:const常量

当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;//错误,不能用于修改所指对象的值

以上全为自己的理解!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值