在C++中,顶层const可以表示任意的对象是常量,而底层const则是与指针,引用这样的复合符合类型相联系。确切地说,在指针中,既有底层const之说,也有顶层const的说法。但在引用中就只有底层const,原因是顶层const表示任意的对象是常量,而引用不是对象。而在其他的类型中出现的const一般都是顶层const
int val = 3;
const int val1 = 5; //顶层const
const int *p1 = &val; //底层const;
int *const p2 = &val; //顶层const
const int *const p3 = &val; //左边的const是底层const,右边的const是顶层const
const int &ref = val; //底层const
对象是底层const还是顶层const的区别就是在对象的拷贝上,对于一个顶层const对象的拷贝是没有印象的,其中的一个原因就是非常量可以转化为常量。
val = val1; //可以
而如果要拷贝的对象是底层const的话,那么就必须要满足一定的条件,如果是有关引用的赋值的话,我们就只需要看它是否满足引用的赋值规则,否则,拷入的对象和拷出的对象必须都要具有底层const。
有关引用的赋值规则,之前有写过。有关引用的赋值规则
bConp1 = p3; //可以,两者都具有底层const
在指针中,我们可以这样去判断:如果允许我们修改指针的值,那么这个const是一个底层const,否则,是一个顶层const。换句话说,底层const修饰的指针是常(量)指针,而顶层const修饰的指针是指针常量。
常(量)指针:即虽然指针所指的对象本身可能不是常量,但我们不可以通过指针来修改这个对象,但我们可以用别的对象的地址再来初始化这个指针。
指针常量:只能被一个对象的地址初始化。