博主信息
Sky
博文
421
粉丝
0
评论
0
访问量
9757
积分:0
P豆:863

C++中的二等公民

2021年10月19日 19:56:40阅读数:13博客 / Sky

在原来的C语言中,enum、const、auto等关键字都不尽完善,并没有发挥应有的功能,是二等公民,而随着时间的推移,在C++中他们都被完善了,有些还被赋予了新的功能,担当起了重要的角色。相反,原本在成员中称王称霸的一等公民,比如macro宏,在C++中成了贱民,惨遭抛弃。下面我们来仔细看看各种情况。

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++语法规则所不允许。

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来修饰。

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关键字可以起到事半功倍的效果。

4,#define

在C语言中,尤其在Linux内核代码中称王称霸的宏定义,在C++中不受待见,虽然宏运行速度快,但由于其他的诸多缺点,功不抵过,最终还是被抛弃,被const常量、inline函数等替代。宏定义的缺点有:

第一,无法确定类型。这在上面将const常量提过,无法确定类型的宏定义不管是对人还是对机器,都没有什么好处。

第二,复杂带参宏的逻辑难以理解,尤其是当参数是比较复杂的表达式时。

C++为了保留宏的优点(直接在代码调用出展开,无需跳转)发明了内联函数,内联函数本身是函数,因此不存在宏参数无类型、无语法检测等缺点。同时,内联函数在编译阶段(而不是预处理阶段)将代码直接插入调用的地方,实现无需跳转的特性,因此又具有了宏执行快速的优点。

C++语言还有更多有意思的特性等待我们去探索,它是一门超级语言联邦工具,难学易用,坚持到底终会见到阳光。

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • c语言里维数组在内存存放顺序是按行存放维数组A[m][n],这是一个m行,n列维数组,设a[p][q]为A第一个元素,即维数组行下标从p到【m+p】,列下标从q到【n+q】即可。
    c语言里维数组元素在内存是按行存放
    丫指是YY直播平台,是一个包含音乐、科技、户外、体育、游戏内容在内国内全娱乐直播平台,移动端越活跃用户超4100万,签约星级主播超150万。
    Visual C++是微软一款免费C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI编程语言;具有程序框架自动生成、灵活方便类管理、代码编写和界面设计集成交互操作、可开发多种程序优点
    零基础学c语言可以看《C语言入门经典》,《C primer plus》。第一本书例子简单生活化,而且每个例子分析很细,第本书适合希望系统学习C语言读者。
    根据华为方舟编译器资料,可以得知鸿蒙系统是用CC++语言编写。鸿蒙系统和方舟编译器思路是一样,直接使用机器语言编写app,取消安卓系统ART虚拟机,直接编译为进制机器码。
    C语言每条可执行语句都将转换成进制机器指令。C语言非执行语句不会被编译,不会生成进制机器指令。C语言不仅可以发挥出高级编程语言功能,还具有汇编语言特点。
    计算机级高级办软件考OFFICE2010版本,全国计算机级考试采用Windows7操作系统环境,操作软件为Microsoft Office2010,考试软件和最新版官方教材是一致
    python表示方法:Python表达式写法与【C/C++】类似,不于符号是【!=】,代码为【if a!=b:print "a不于b"】。
    微信小店与小程序区别是:1、微信小店是微信众号交易工具,依附于微信众号通过内容作为流量场景;2、微信小程序则可以通过多个流量场景、如附近小程序,使用过小程序,搜一搜,维码导流多个流量场景
    C语言a++和++a区别是:运算过程不同,a++表示先使用a值,然后再对a做加1处理;++a表示先对a做加1处理,然后再使用a值。a++和++a都价于【a = a+1】。
    cwindows文件夹是不可以删除,但是Windows文件夹下部分文件可以删除,例如:1、“C:\WINDOWS\Temp”系统临时文件;2、“C:\WINDOWS\ServicePackFiles
    C++给维数组初始化方法:首先定义两个整型变量,并给维数组初始化不同数值;然后用重循环,输出数组各个数值;最后用大括号括起来数字直接赋值。
    C语言int取值范围是:“-2147483648 ~ 2147483647”。
    word是一种常用软件类型,是MicrosoftOffice办软件一种,MicrosoftOffice是微软司开发一套基于Windows操作系统软件套装,常用组件有Word、Excel
    三角形面积式大家应该都知道吧,也就是面积分之一乘以底乘以高,哈哈,忘了也没关系,本文就给大家介绍如何用js计算三角形面积。
    给定一个叉搜索树, 找到该树两个指定节点最近共祖先。百度百科最近共祖先定义为:“对于有根树T两个结点p、q,最近共祖先表示为一个结点x,满足x是p、q祖先且x深度尽可能大。”
    C语言文件类型只有ASCII文件和进制文件两种。ASCII码文件通常用于存放输入数据及程序最终结果;进制文件用于暂存程序间结果,以供另一段程序读取。
    维数组在内存存放顺序是按行存放,即放完一行之后再放入第行;也就是先存放“a[0]”行,再存放“a[1]”行,接着存放“a[2]”行,以此类推直到元素放完;每行元素也是依次存放。
    excel取数使用方法:首先选一个单元格准备写于“我是国人”前两位,选B6;然后在B6输入式“=LEFT(C4,2)”就会出来“我是”这两个字;最后在D6输入式“=RIGHT(C4,3