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

来源:互联网 发布:淘宝粉丝红包 编辑:程序博客网 时间:2024/06/05 03:03

最近看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;//顶层constconst 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 0
原创粉丝点击