当前位置:网站首页>const的自己理解
const的自己理解
2022-08-10 17:35:00 【波雅_汉库克】
说明:为什么标题是关于C++ const的记录,而不是C/C++关于const的记录.这是因为C语言的const和C++的const是有点区别的.
至于什么区别,用一句话来说就是: C++中的const默认认为是内部连接,也就是说const仅在const被定义过的文件里才是可见的,而在连接时不能被其他编译单元看到.C语言的const默认认为时外部连接.
这里主要讨论C++的const,C语言的const等需要的时候在仔细研究研究.
一 头文件里的const
默认的定义const,编译器是不会给const创建存储空间的,但有两个例外:
- 使用extern声明为外部连接
- 取const地址
这两种情况编译器会给const分配内存空间.
二 const的使用
普通变量:
void testConst()
{
const int i = 100;
const int j = i + 10;
const int *addr = &j;
char buf[j + 10];
std::cout << "i = " << i << std::endl;
std::cout << "j = " << j << std::endl;
std::cout << "j addr = " << addr << std::endl;
std::cout << "*j addr = " << *addr << std::endl;
std::cout << "buff sizeof = " << sizeof(buf) << std::endl;
}
输出:
变量addr存储的是j的地址,所以*addr其实就是j,这两个是等价的,至于buf 的大小是120,是因为j=110,再加10就是120了.
指针
指向const的指针
注意:这里有个注意点,就是指向const的指针和下面的const指针是两回事.
const的读法:定义指针的技巧是在标识符的开始处读它,并从里向外读.
demo:
const int *u;
首先明确一下u是一个指针,所以*u是不可以分离的.然后就是按照上面的技巧,在标识符(const)开始读它."u是一个指针,它指向const int".这里不需要初始化,因为u可以指向任何标识符(也就是说,它不是一个const),但是它指向的值是不能被改变的(指向的值是const).
int const *v; 这个怎么读?
首先明确v是一个指针,所以*v是一个整体.然后按照读法,在标识符开始处读它,并从里向外.
"v是一个指针,它指向const的int的普通指针".
即,const又把int结合在一起,效果与前面定义的一样.两个定义是一样的,这一点容易让人混淆.为了使程序具有可读性,应该坚持使用第一种.
const指针
使指针本身成为一个const指针,必须把const标明的部分放在*右边:
demo:
int d =1;
int * const w;
这个的读法:"w是一个指针,它指向int的const指针";因为指针本身现在是const指针,编译器要求给它一个初始值,这个值在指针生命周期内不变.然而要改变它锁指向的值是可以改变的:
*w = 2;
如果想地址和值都不能改变应该这怎么做.
int d = 1;
const int * const x = &d; 或者
int const * const x2 = &d;
赋值和类型检查
- 可以把一个非const对象的地址赋值给一个const指针.
- 不能把一个const对象的地址赋值给一个非const指针.(当然,总能用类型转换强制进行这样的赋值,但是这是一个不好的习惯,因为这样就打破了对象的const属性以及const提供的安全性)
int d = 1;
const int * const w = &d;
int* x = (int*)w;
std::cout << "d = " << d << std::endl;
std::cout << "w = " << *w << std::endl;
std::cout << "x = " << *x << std::endl;
如果:
int* x = w; 这样是错误的,因为违反了第二条.但是使用强制类型转换就可以了.
边栏推荐
猜你喜欢
机器人控制器编程实践指导书旧版-实践六 LCD液晶显示(点阵)
烟雾、空气质量、温湿度…自己徒手做个环境检测设备
CDH6.3.2之Kerberos安全认证_大数据培训
直播回顾|多云时代,如何建设企业级云管理平台?(附建设指南下载)
FFmpeg extract H264 nalu from the mp4
【接入指南 之 直接接入】手把手教你快速上手接入HONOR Connect平台(中)
【云原生| Docker】 部署 Django & mysql 项目
FFmpeg 从mp4上提取H264的nalu
Word里表格跨页时自动断开,表格后留有空白部分,未布满整页,如何操作让表格上下页均匀布满?
The DGIOT platform displays the whole process code analysis of OPC reporting data in real time
随机推荐
如何构建一个自己的代理ip池
perl编码转换
电路板ROHS测试报告怎么办理?电路板ROHS检测流程
CDH6.3.2之Kerberos安全认证_大数据培训
redis分布式锁
同一块中出现两个 * 就不能正常显示
中国芯片的营收首破万亿,优势凸显的成熟工艺产能将称霸全球
海思HI3516DV300开发资料
R语言使用ggpubr包的ggbarplot函数可视化柱状图、设置add参数为mean_se和jitter可视化不同水平均值的柱状图并为柱状图添加误差线(se标准误差)和抖动数据点分布
node环境变量配置,npm环境变量配置
华为云连续5年保持中国政务云基础设施市场份额第一…
SQL优化的魅力!从 30248s 到 0.001s
LeetCode 198:打家劫舍
机器人控制器编程整理汇总-辞旧迎新-
Go-Excelize API源码阅读(六)—— DeleteSheet(sheet string)
【云原生| Docker】 部署 Django & mysql 项目
还在用 Xshell?你 out 了,推荐一个更现代的终端连接工具,好用到爆!
期货开户前要第一时间确认手续费
未来5年的9大技术趋势
mysql主主复制+keepalived高可用