关于C++ 顶层const和底层const对拷贝操作的影响

最近看C++Primer,里面的顶层const和底层const有点让人搞混,现在总结出以下几点,问题就好解决了:
一、关于顶层const
执行拷贝操作时,顶层const不会有太大影响,但有两个例外:
①非常量引用不能绑定常量。
②非常量指针不能指向常量。

const int ival = 0;
int &ri = ival;//错误,非常量引用不能绑定常量。
int *iptr = &ival;//错误,非常量指针不能指向常量。

所以虽说ival是顶层const,但是上面那两个操作是非法的。

二、关于底层const
底层const在执行拷贝操作时的限制比较大,总结出两点:
①、当拷贝操作的右侧对象具有底层const是要求左侧对象也要有底层const资格(注意是右侧对象具有底层const的时候而不是左侧):

const int val = 0;//顶层const
const int &r= val; //左侧对象为底层const

想上面左侧对象为底层const,而右侧对象为顶层const,不要求为底层const,而且常量引用本身就可以绑定到常量对象上。

回看上面那段代码:

const int ival = 0;
int *iptr = &ival;//错误,非常量指针不能指向常量。

ival是一个顶层const,const int 加取地址符&后变成const int *,变成了底层const,第二个语句右侧对象为底层const,而iptr为普通指针,不具有底层const的资格,所以拷贝是非法的,也可以这样解释。

②、非常量对象一般可以转换成常量,而反过来常量则不能转换成非常量。

int i = 0;
const int &ri = i;

第二句中右侧对象i是非常量,而ri是常量,非常量一般能转换成常量,所以拷贝是合法的。

注意上面的转换,是右侧对象的转换,而不是左侧对象向右侧对象的转换。

弄清以上这几点,顶层const和底层const的问题也就好理解了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值