C++ 顶层const与底层const总结

2017-09-25  本文已影响0人  GThyton

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)才能组成真正的重载函数。

上一篇下一篇

猜你喜欢

热点阅读