IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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 “分割线”)]

1, enum

此关键词可以用来定义所谓枚举类型,枚举的本质含义是一种取值范围受限的整型,比如颜色规定为红橙黄绿青蓝紫七色,那么就可以使用数字0-6来指代,再比如进程状态规定为睡眠、运行、暂停、死亡等,可以分别使用0-3的数字来指代,在C++中,可以使用以下代码来达到以上目的:

enum spectrum {red, orange, yellow, green, blue, cyan, purple};
enum spectrum color;
color = red; ?// 正确
color = 1; ?  // 错误

上述代码体现了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 “分割线”)]

2,const

在C语言标准中,const关键字的作用被描述为模棱两可的“只读变量”的意思,使用const修饰的变量无法再次赋值,但却又不被认为是常量(比如无法在case语句总使用),因此单独使用const来修饰一个普通变量的情况,在C语言中几乎是绝迹。在C语言中const几乎唯一的作用是:修饰一个指针,比如:

char *strncpy(char *dest,?const?char *src, size_t n);

这样的const的作用就是对指针的访问权限进行限制,使其只保留读操作权限,被剥夺写操作权限,让代码更安全。

在C++中,const关键字被赋予更多有益的功能,去掉含糊不清的概念。其功能总结如下:

第一,定义具有类型的常量,用来替代宏,比如:

const float PI = 3.1415;

以上定义语句比宏定义要好,因为具备类型检测,相反,宏定义没有类型检测,在C++代码中不再被推崇。

第二,用以区分函数特征标。在C++中,函数都可以重载,函数本身使用const来修饰,或者某个参数使用const来修饰,都能使得函数的特征标发生改变,从而可以被重载,比如在每个类A中,可以定义两个重载的成员方法:

void A::f();
void A::f()const;

以上两个函数将被视为重载,其中const版本的函数只能有const常对象来调用,比如:

A a;       // 此处定义了一个普通对象a
const A b; // 此处定义了一个const对象b
a.f();     // 此时调用的是 A::f() 版本
b.f();     // 此处调用的是 A::f()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 “分割线”)]

3,auto

在C语言中,auto几乎是废弃的,因为它的含义是使得局部变量存储在栈中,即成为所谓自动变量(区别于静态变量)。而C语言的语法又规定,局部变量的默认存储区域就是栈,因此auto就是鸡肋,逐渐被遗弃。

int f(void)
{

    int a;
    auto int b;
    static int c;
}

上述代码完整体现了为什么C语言中auto被遗弃,a是一个不加任何存储类修饰的局部变量,默认就存放在栈内存,代表其生命周期是临时性的。变量b跟a完全一样,auto就是它们默认的存储类修饰符。变量c则不同,它被存储于静态数据区,代表其生命周期与整个程序相同。

在C++中,auto被赋予了全新的含义,也更契合其名字:自动。C++中的auto意味着“自动类型推导”,请看以下例子:

int a;
auto b = a;

定义b的时候,如果无法事先确定b的类型,但可以由赋值的数据的类型来自动匹配,此时就是auto派上用场的实际,上面的例子比较简单,在一些模板类、模板函数的设计中,auto关键字可以起到事半功倍的效果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZlJc6YvT-1629021449412)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/025f0d0dfa1e424abc0554b9277802d1~tplv-k3u1fbpfcp-zoom-1.image “分割线”)]

4,#define

在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语言常见错误合集
上一篇文章           查看所有文章
加:2021-08-17 01:23:14  更:2021-08-17 01:24:05 
 
开发: 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年5日历 -2024/5/20 1:53:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码