C++中顶层const与底层const在使用中区分还是挺大的,比较容易搞混,所以单独总结一下。
1.什么是顶层const与底层const
简单的说顶层const就是const定义的变量本身是一个常量,底层const就是const定义的变量所指向的对象是一个常量。
举个例子:
charc = ‘c’;
char*const p1 = &c; (1)
constchar *p2 = &c; (2)
constchar p3 = 'c'; (3)
(1)表达式中p1是一个常量指针,const施加在p1这个指针上,所以p1这个变量就不能在改变了,所以不能再对p1进行赋其他值了,但是p1这个指针可以通过解引用的方式来改变其指向的值,所以表达式(1)对应const是顶层const。
(2)表达式中p2这个指针所指的对象是一个常量,就是说不能通过对p2进行解引用来改变p2所指向的值,但是p2这个指针却是可以改变指向的,所以表达式(2)的const属于底层const
(3)表达式中p3这个变量的值不能再被改变,所以(3)中的这个const属于顶层const。
2.顶层const与底层const用途
在函数重载时顶层const与底层const会很容易让人迷惑。同样举个例子说一下吧。
在函数重载时要满足函数名相同函数参数不同,考虑以下这种状况。
voidtest(char *p); (1)
voidtest(char * const p); (2)
voidtest(const char *p); (3)
考虑上面三个表达式,哪两个才是真正的函数重载?
其实区分函数重载,要以调用者的身份来看或许更能说明问题。
底层指针常量需要的实参是一个常量,一个拥有顶层const的形参无法与另一个没有顶层的const形参区分开来。其实编译器在区分重载函数时会自动屏蔽顶层const。
所以上述三个表达式只有(1)(3)或(2)(3)才能组成真正的重载函数。