当前位置: 首页 > news >正文

C++中多才多艺的 const

1. 定义一个常全局变量1constintglobal 100;// 初始化之后不可再赋值这样的global实际上是一个常量这是C用来取代宏定义的其中一种措施const常量有类型检测提高编译器的效率。2. 定义常指针这有两个版本分别是123constint*p1 a;// p1不能修改它所指向的目标intconst*p1 a;// p1的另一种等价形式int*constp2 a;// p2本身不可修改上述代码中的p1经常被用作函数参数用以限制指针的权限在安全性方面功不可没。p2用的很少我们很少需要一个本身指向不可变的指针3. 定义一个STL的常迭代器这也有类似的两个版本123vector::const_iterator it1;// it1不能修改它所指代的目标对象constvector::iterator it2;// it2本身不可修改由于迭代器实际上就是广义指针因此it1实际上相当于上述代码的p1it2相当于上述代码的p2同理it1用的较多用来限制迭代器的权限。4. 定义一个类的内部常成员包括常成员数据和常成员方法1234567891011classtext{constintaconst 100;// 常成员数据必须初始化voidfunc(void)const;// 常成员方法只能由常对象调用staticintastatic;};类的常成员数据aconst意味着类对象无法对其修改这个很容易理解。至于类的常成员方法func就破费脑力了语法上的理解是func不能修改任何一个类对象的bit这是显而易见的这也正是C标准对const成员方法的定义。\来近距离看看func方法的使用1234567891011inttext::astatic 100;// 类外初始化静态数据voidtext::func(void)const// 类外定义const成员方法{astatic 200;// 没毛病astatic不是对象数据此处可以被修改aconst 200;// 错误const型函数不可修改类对象数据}定义如上的成员方法很重要因为它明确地告诉了类的使用者哪些函数可以修改类对象信息哪些不会修改类对象信息。像func()这样的函数const成员方法只能被常对象调用以确保不违反权限紧缩原则比如1234text t1;// 普通对象t1consttext t2;// const型对象t2t1.func();// 错误普通对象不可调用常成员方法t2.func();注意函数本体的const属性是可以被视为重载的依据的换句话说如果以上类text提供了non-const版本的func函数那么t1将会自动调用non-const那个版本。以上陈述似乎平淡乏味但考虑C语法规定的这种bit-wise特性的常成员在处理类成员指针并且指针指向类外部内存时情况也许会变得有趣。5. bit-wise和logical-wise常特性所谓bit-wise constness指的是类对象的内部内存意义上只读约束而loigcal-wise指的是逻辑意义上的只读约束。编译器没有智能它只能实现bit-wise意义上的约束下面的例子讨论const成员operator[ ]的表现可以帮助理解12345678910111213classtext{... ...charoperator[ ](intpos)const;private:char*p;};// const关键字保证了该成员方法只能被 const 对象调用chartext::operator[ ](intpos)const{returnp[pos];}上述代码中类text存储真正字符串的地方是指针 p 指向的内存区域假设此时定义一个const型的常对象那么它只能保证类内部信息也就是p本身不被修改却无法保证其所指向的内存区域的安全性。来看下面的代码123consttext ct(abcd);ct[0] A;// 一个被编译器允许却跟逻辑相悖的语句此处ct是一个const型对象从字面理解出发我们应该认为ct对象是一个常量我们应该无法通过任何方式修改其内部信息但可惜ct里面的字符串信息实际上并不存在在类内存区域中于是就出现了可以对一个const型对象进行赋值的有趣现象。解决以上问题也不难可以改写 operator[ ] 成员方法的返回值类型1constcharoperator[ ](intpos)const;此时就再也不能对 ct[0] 赋值了但这只是个个例关键我们要掌握的内容是如果我们的类对象拥有成员指针那么一般意义上的const成员方法只能保证bits-wise的常量性即保证类对象内部的内存信息不被修改但无法保证所谓的logical-wise的常量性即保证逻辑上哪些信息不被修改。
http://www.gsyq.cn/news/1359912.html

相关文章:

  • S-Video端口ESD防护方案解析:低电容TVS阵列选型与PCB布局实战
  • 【流体】二维稳态不可压缩层流通道流利用FVM和SIMPLE 解平行板间层流的速度、压力和温度【含Matlab源码 15558期】
  • 速度对决:2026实测几秒内搞定的PDF转Word闪电工具 - 时讯资讯
  • 写给新手的 asnumpy:昇腾原生 NumPy 到底是啥?
  • ISO 26262标准下嵌入式软件模型测试解决方案全解析
  • C语言不完全类型与抽象数据类型:从编译原理到模块化设计实战
  • NotebookLM显著性判断深度解析(Google Research未公开的置信度衰减模型)
  • 基于RT-Thread与硬件JPEG解码器的嵌入式音乐相册开发实践
  • AI智能体Skills设计:从API工具到核心能力的工程实践
  • 嵌入式开发硬件生态构建:MIPI屏、UVC摄像头与4G模块的选型与集成实战
  • 2026年探秘:直击geo源头厂家,揭秘背后的故事
  • 为合宙Air32开发板刷写USB DFU Bootloader的完整指南
  • LosslessCut 3.68.0 官方版下载(夸克网盘+百度网盘,SHA256校验)
  • 3分钟搞定!全平台资源下载神器res-downloader终极使用手册
  • 【行业首曝】AI Agent测试工具链选型红黑榜:LangTest vs Guardrails vs custom LLM-evaluator,附真实TPS/误报率/可解释性压测数据
  • AI知识管理工具采购决策树(2026版):基于217家企业的ROI建模,精准匹配团队规模/安全等级/知识密度
  • AI Agent如何重构私教服务流程:3个已被连锁健身房验证的降本增效模型
  • 3分钟上手跨平台资源下载神器:轻松获取微信视频号、抖音无水印内容
  • 救命!书匠策AI居然能让毕业论文“自己长出来“?一个教育博主的真实测评
  • 光伏板缺陷检测数据集|红外可见光双模态|无人机光伏巡检|智慧电网光伏识别数据集
  • 汽车12V电源防护:P6KE TVS二极管选型、设计与实战指南
  • 汽车12V电源保护:TVS二极管选型、应用与EMC测试实战
  • 基于RK3399核心板的智能PCR仪开发:从嵌入式系统到高精度温控
  • 5G FWA智能终端技术解析:从核心架构到运营商集采实战
  • 增程式电动汽车预测型能量管理策略【附算法】
  • 团队冲刺每日总结5.23
  • RK3588蓝牙功能完整测试指南:从驱动到应用实战
  • 全志T113-S3开发板XR829 WiFi蓝牙驱动加载、固件配置与稳定性测试全攻略
  • 全志T113-S3开发板WiFi与蓝牙功能实测:从驱动到应用的完整指南
  • RK3588开发板实战:从嵌入式Linux到AI边缘部署全解析