首先,顶层const和底层const都是相当于指针而言的,比如说const int a
,这个const既不是顶层也不是底层,因为a不是指针。
其次,如何看const是修饰的什么呢。
原则是谁在const的左边就修饰谁,如果const的左边没有任何东西,就修饰右边的第一个值,以下举例说明。
const int const * p
,第一个const的左边没有东西,所以修饰的是右边的int,第二个const左边有int,所以修饰的也是int,这两个const都修饰的是int,所以这句话会报错。
const int * const p
,第一个const的左边没有东西,所以修饰右边的int,第二个const的左边有*,所以修饰的是*。
int const * const p
,第一个const的左边是int,所以修饰int,第二const的左边是*,所以修饰的是*。
最后,怎么区分顶层const和底层const呢?
顶层const修饰的是*,指针本身不能变,但它指向的内容可以改变。比如说int * const p
,可以改变 * p
,但不能改变p本身。
底层const修饰的是类型,指针可以改,它变量本身不能改变,比如说const int* p
,p是可以改变的,但是p所指向的内容*p
不能改变。
这里有个额外的知识点,如果是底层const,C++是支持重载的,如果是非底层const则不支持重载。