//顶层const表示指针本身是一个常量
//底层const表示指针所指对象是一个常量
int main()
{
int i = 0;
int *const p1 = &i;//不能改变p1的值,p1是一个顶层const
const int ci = 42;//不能改变ci的值,ci是一个顶层const
const int *p2 = &ci;//允许改变p2的值,这是一个底层const
const int *const p3 = p2;//左边的const是底层const,右边的const是顶层const,p3是指向常量对象的常量指针
const int &r = ci;//用于声明引用的都是底层const
//当对象执行拷贝操作时
//顶层const不受什么影响,因为不会改变被拷贝对象的值,拷入拷出的对象是否是常量都没有什么影响
i = ci;
p2 = p3;//它们有同样的底层const,p3还有顶层const但是没有影响
//底层const存在一些限制
//拷入拷出的对象必须拥有相同的底层const资格或者两个对象的数据类型必须可以转换
//一般而言,非常量可以转换为常量,反之不行
int *p = p3;//非法,p3有底层const定义,p没有
p2 = &i;//正确,int*可以转换为const int*
int &r = ci;//错误,普通int不能绑定到int常量上
const int &r2 = i;//正确,int常量可以绑定到普通int上
//练习
//判断下列对象被声明成了底层还是顶层const
const int v2 = 0;//顶层const
int v1 = v2;
int *p1 = &v1, &r1 = v1;
const int *p2 = &v2;//底层const
const int *const p3 = &i;//左边const是底层const,右边const是顶层const
const int &r2 = v2;//底层const
//下列语句是否合法
r1 = v2;//合法,v2是顶层const
p1 = p2;//非法,p2有底层const而p1没有
p2 = p1;//合法,int*可以转换为const int*
p1 = p3;//非法,p3有底层const而p1没有
p2 = p3;//合法,p2和p3都有底层const
}
C++中的顶层const
最新推荐文章于 2024-04-05 16:37:51 发布