最近在准备秋招,复习到了const。看到了一些关于const的问题和回答。感觉大家在针对const的顶层和底层这个点上说的都不是很清楚。今天想借这个机会和大家一起聊聊顶层const和底层const到底是怎么一回事。
首先,const有顶层和底层之分,起源是对指针的使用。指针作为一个对象,同时它还指向了另一个对象。因此,指针是不是一个常量,以及指针指向的对象是不是常量,这是两个问题。基于此,有了底层和顶层const的区分。
*
对其进行修改。后来,这个顶层和底层的概念从指针延展开来,对于任意数据类型,都可以使用这个概念。
正如我上面所说,指针是不是常量,和指针指向的对象是不是常量,这是两个问题,在实际使用上,不能混为一谈。
区分的意义主要有两点:
int a = 10;
// 顶层const
int *const pTop = &a;
// 底层const
const int *pDeep = &a;
int *pNormal = pTop; // 正确。带有顶层const的指针能够赋值给普通指针
int *pNormal = pDeep;// 错误,const int * 不能转换为 int *
从这个demo中,顶层const的指针可以拷贝赋值给普通的指针,但是底层const的指针无法拷贝赋值给普通的指针。这便是两者在拷贝时的差别。
const_cast
,只能去除底层constint a = 10;
// 顶层const
int *const pTop = &a;
// 底层const
const int *pDeep = &a;
// 正确。const_cast去除了pDeep指针的底层const属性
int *pNormal = const_cast<int*>(pDeep);
*pNormal = 20;
cout << a << endl; // 20
// const_cast无法去除顶层const
int b = 100;
const_cast<int*>(pTop) = &b; // 错误
其实顶层和底层const并不是一个复杂的概念。设计这个概念的目的是为了区分【指针是常量】和【指针指向的对象是常量】这两种情况。
对于顶层和底层的实际使用意义,记住底层const无法拷贝给没有const的对象就行了。(背const_cast的时候就知道了它只能去除底层const了)
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务