秋林箭

每夜,携酒河上,饮且渔

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

顶层const:修饰对象本身

底层const:修饰指着所指对象,或者引用的对象

所以引用是底层的,指针即可是底层也可是顶层,int等非指针类型是顶层的。

总的原则是拷贝对象时,等号右边的对象的顶层const可以忽略,底层的const不行,等号左边的const都没有影响。当涉及指针所指内容,或者引用时,要求类型相同,除了两个例外(非常量可以赋值给常量,派生类对象赋值给基类指针或引用)。

1、不涉及指针,引用时,是拷贝对象本身,并不会影响原来的对象,所有的const都是底层,所以全部可以忽略(要求除了const的类型相同,或者可以转换)。

int a=0;

const int b=1;

a=b;

b=a;

2、指针的顶层const可以忽略,底层const必须考虑,不允许等号右边底层const等号左边非底层const,允许等号右边非底层const左边是底层const。

int*const p1=&a;

int*p2=&b;

p1=p2;

p2=p1;

const int *const p3=&a;

p1=p3;//错误!!!

3、引用全部是顶层const,不允许等号右边是常量(相当于底层const)等号左边非底层const,允许等号右边是非常量(相当于非底层const)左边是底层const。

const int c=0;

int &r=c;//错误!!!

const int&r1=a;

还有一个要注意的,引用的除了const外的类型不能转化!

int d=0;

double &r2=d;//错误!!!

因为类型不一致,会先生成temp临时变量,但是写作引用的本意就是使用r2来修改d,这样通过r2只能修改temp,没有意义,所以编译器就把这样的写法定义成错误!

posted on 2015-10-09 15:38  zhangyee  阅读(419)  评论(0编辑  收藏  举报