| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C语言中的二等公民在C++是如何翻身的? -> 正文阅读 |
|
[C++知识库]C语言中的二等公民在C++是如何翻身的? |
在原来的C语言中,enum、const、auto等关键字都不尽完善,并没有发挥应有的功能,是二等公民,而随着时间的推移,在C++中他们都被完善了,有些还被赋予了新的功能,担当起了重要的角色。相反,原本在成员中称王称霸的一等公民,比如macro宏,在C++中成了贱民,惨遭抛弃。下面我们来仔细看看各种情况。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lqbcFCV9-1629021449406)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fd787d95557f41dd9ca77dee886610fa~tplv-k3u1fbpfcp-zoom-1.image “分割线”)]
此关键词可以用来定义所谓枚举类型,枚举的本质含义是一种取值范围受限的整型,比如颜色规定为红橙黄绿青蓝紫七色,那么就可以使用数字0-6来指代,再比如进程状态规定为睡眠、运行、暂停、死亡等,可以分别使用0-3的数字来指代,在C++中,可以使用以下代码来达到以上目的:
上述代码体现了C++中枚举的用法,第一行定义了一个范围从red到purple的枚举整数类型spectrum,这里的red默认是0,后续的枚举常量以此递增。第二行中我们使用该类型定义了一个枚举变量color,color的取值范围只能是七色之一,不能是别的,因此直接将1赋值给color是错误的,即使这么做数值上无可厚非,但却破坏了枚举的可读性,被C++语法规则所不允许。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nfjpQdiH-1629021449408)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f1897e771e7646c3935d8728dfed0839~tplv-k3u1fbpfcp-zoom-1.image “分割线”)]
在C语言标准中,const关键字的作用被描述为模棱两可的“只读变量”的意思,使用const修饰的变量无法再次赋值,但却又不被认为是常量(比如无法在case语句总使用),因此单独使用const来修饰一个普通变量的情况,在C语言中几乎是绝迹。在C语言中const几乎唯一的作用是:修饰一个指针,比如:
这样的const的作用就是对指针的访问权限进行限制,使其只保留读操作权限,被剥夺写操作权限,让代码更安全。 在C++中,const关键字被赋予更多有益的功能,去掉含糊不清的概念。其功能总结如下: 第一,定义具有类型的常量,用来替代宏,比如:
以上定义语句比宏定义要好,因为具备类型检测,相反,宏定义没有类型检测,在C++代码中不再被推崇。 第二,用以区分函数特征标。在C++中,函数都可以重载,函数本身使用const来修饰,或者某个参数使用const来修饰,都能使得函数的特征标发生改变,从而可以被重载,比如在每个类A中,可以定义两个重载的成员方法:
以上两个函数将被视为重载,其中const版本的函数只能有const常对象来调用,比如:
第三,用来提高程序的健壮性和执行效率,做法是将所有不需要修改其值的变量统统用const来修饰,简而言之,就是能用const的地方尽量都用const。这点跟C语言的一致。比如在上述的strncpy函数中,由于不需要修改src指针的值,因此使用const来修饰。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t5bsAlho-1629021449410)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/85ce5ae484b146eca5f29b056477d8d2~tplv-k3u1fbpfcp-zoom-1.image “分割线”)]
在C语言中,auto几乎是废弃的,因为它的含义是使得局部变量存储在栈中,即成为所谓自动变量(区别于静态变量)。而C语言的语法又规定,局部变量的默认存储区域就是栈,因此auto就是鸡肋,逐渐被遗弃。
上述代码完整体现了为什么C语言中auto被遗弃,a是一个不加任何存储类修饰的局部变量,默认就存放在栈内存,代表其生命周期是临时性的。变量b跟a完全一样,auto就是它们默认的存储类修饰符。变量c则不同,它被存储于静态数据区,代表其生命周期与整个程序相同。 在C++中,auto被赋予了全新的含义,也更契合其名字:自动。C++中的auto意味着“自动类型推导”,请看以下例子:
定义b的时候,如果无法事先确定b的类型,但可以由赋值的数据的类型来自动匹配,此时就是auto派上用场的实际,上面的例子比较简单,在一些模板类、模板函数的设计中,auto关键字可以起到事半功倍的效果。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZlJc6YvT-1629021449412)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/025f0d0dfa1e424abc0554b9277802d1~tplv-k3u1fbpfcp-zoom-1.image “分割线”)]
在C语言中,尤其在Linux内核代码中称王称霸的宏定义,在C++中不受待见,虽然宏运行速度快,但由于其他的诸多缺点,功不抵过,最终还是被抛弃,被const常量、inline函数等替代。宏定义的缺点有: 第一,无法确定类型。这在上面将const常量提过,无法确定类型的宏定义不管是对人还是对机器,都没有什么好处。 第二,复杂带参宏的逻辑难以理解,尤其是当参数是比较复杂的表达式时。 C++为了保留宏的优点(直接在代码调用出展开,无需跳转)发明了内联函数,内联函数本身是函数,因此不存在宏参数无类型、无语法检测等缺点。同时,内联函数在编译阶段(而不是预处理阶段)将代码直接插入调用的地方,实现无需跳转的特性,因此又具有了宏执行快速的优点。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-661U9yQl-1629021449414)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7072d5564acb4a938321c86c7d920228~tplv-k3u1fbpfcp-zoom-1.image “分割线”)] C++语言还有更多有意思的特性等待我们去探索,它是一门超级语言联邦工具,难学易用,坚持到底终会见到阳光。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/26 16:39:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |