C++相比于C语言增加的8个特性(详解)

news2024/9/25 23:21:13

C++相比于C语言增加的8个特性(详解)


文章目录

  • C++相比于C语言增加的8个特性(详解)
  • 一、命名空间
  • 二、C++输入和输出
  • 三、缺省参数
  • 四、函数重载
  • 五、引用
  • 六、内联函数
  • 七、auto关键字
  • 八、指针空值nullptr
  • 总结


一、命名空间

c++的命名空间是为了弥补C语言的坑,比如我们定义一个变量:rand,就会出现以下问题!
在这里插入图片描述
c++调整这一缺点,来进行调整,引用了关键字:namespace

使用方式如下(示例):

#include<stdio.h>
#include<stdlib.h>
namespace ming
{
	int rand = 0;
}
int main()
{
	printf("%p\n", rand);
	printf("%p\n", ming::rand);
	return 0;
}

命名空间定义和使用
在这里插入图片描述
1.命名空间里面也可以嵌套使用
2.如果在同一个工程中,命名空间名字相同,则编译器自动合成为同一个命名空间。
如果想方便一点,可以直接 using namespace std 直接声明即可!
3.项目中,尽量不要使用using namespace std
4.日常练习用using namespace std
5.项目和指定命名空间访问+展开常用


二、C++输入和输出

由于C语言中scanf 和 printf 需要指明数据输入输出的类型,较麻烦,C++引入了cin 和 cout
C++的 cin 和 cout 优点:可以自动识别类型
在这里插入图片描述
如果要控制浮点数的宽度和小数点后的位数,就可以直接用C语言的scanf(C++兼容C语言


三、缺省参数

缺省参数相当于一个备胎,在函数传参时,如果没有参数就用缺省参数,有参数时,就不用缺省参数!
在这里插入图片描述


如果有多个参数需要传参时,遵循从左往右传参原则~!
在这里插入图片描述


以下为半缺省,半缺省默认传参为第一个,此时不可以不传参数!原则:从右往左连续缺省,不能间隔
在这里插入图片描述


缺省参数在实际中的应用为在一些数据结构中初始化一些数组时,不知道capacity大小而出现的问题~
在这里插入图片描述


四、函数重载

在C语言中我们是不允许一个同名函数定义不同的功能而C++弥补了这一缺点,引入了函数重载
C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
在这里插入图片描述


在这里插入图片描述


为什么C++支持函数重载,而C语言不支持函数重载呢?–》C++支持函数重载的原理–名字修饰
原理C++在链接中是用修饰过的名字去找,函数名相同就能找到,C语言直接通过函数名去找,在编译中函数名相同,编译出来生成符号表都去分不出来,所以C++可以函数重载,而C语言不能函数重载


C语言如何调用C++的库,C++如何调用C语言的库?–》 这里引用了 extren ‘C’

C++调用C语言库代码 :如下(示例):

// C++ 调用 C语言 的库
extern "C"
{
     #include<Stack.h>
}

extern “C”告诉C++的编译器,这里面的这些函数是C的库实现的,你用C的规则去链接查找他们!


C语言调用C++库代码 :如下(示例):

// C语言 调用 C++ 的库
#ifdef _cplusplus

extern "C"
{
#endif // _cplusplus
	void StackInit(ST* ps);
	// ....
#ifdef // _cplusplus
}
#endif // _cplusplus

五、引用

引用特性
1.引用在定义时必须初始化!
在这里插入图片描述

2.一个变量可以有多个引用!
在这里插入图片描述

3.引用一旦引用一个实体,再不能引用其他实体!
在这里插入图片描述


引用的使用场景
1、做参数- -a.输出型参数;b.大对象传参提高效率
在交换函数中就很好地体现这一点!
在这里插入图片描述
而我们在定义某些数据结构时,运用引用也很方便!

代码如下(示例):

void SLPushBack(SL& s , int x)
{}

2、做返回值- -a.输出型返回对象,调用者可以修改返回对象;b.减少拷贝,提高效率
在这里插入图片描述
为什么传引用返回比传值返回快呢?


在这里插入图片描述


在这里插入图片描述结论:上面的程序使用引用返回本质是不对的,结果是没有保障的!

在这里插入图片描述

下面这个场景,才会使用传引用返回 :如下(示例):

int& Count()
{
	static int n = 0;
	n++;
	//......
	return n;
}
int main()
{
	int& ret = Count();
	cout << ret << endl;
	cout << ret << endl;
	return 0;
}

传引用返回的实例:
我们在写动态顺序表中的 改top位置的数据时,会用到 查找函数+修改函数,很麻烦!所以我们用传引用来优化一下

原来的修改top位置的数据代码: 如下(示例):

// 顺序表中在指定位置插入一个数据
void SeqListInsert(SeqList* ps, int pos, SLDataType x)
{
	assert(pos <= ps->size && pos >= 0);
	SeqLisrCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->size++;
}

现在传引用返回中 的修改top位置的数据代码: 如下(示例):

// 顺序表中在指定位置插入一个数据
int& SLAt(SL& s, int pos)
{
	assert(pos >= 0 && pos <= s.size);
	return s.a[pos];
}

在这里插入图片描述


需要注意的一点是:运用引用的时候,权限不能放大,但是权限可以缩小!
在这里插入图片描述


如果引用会改变类型,也要加const防止权限扩大!
在这里插入图片描述


函数传参的时候也要注意:
在这里插入图片描述


引用和指针的不同点:
指针和引用用途基本是相似的,在这里我们从两个方面去区分二者:1.使用场景;2.语法特性及底层原理。

1. 引用在定义时必须初始化,指针没有要求
2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
3. 没有NULL引用,但有NULL指针
4.sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
6. 有多级指针,但是没有多级引用
7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
8. 引用比指针使用起来相对更安全

在这里插入图片描述


六、内联函数

在之前学过的堆排序和快速排序中,如果排序10w数据,就会调用很多次swap函数,就会有很多函数压栈的开销。
短小的函数(1~10行)、频繁的调用(10万次)为了解决这一现象,C语言引入了宏函数;C++引入了inline内联函数!

可是C++的创建者又发现C语言中的宏很不方便,具体优缺点如下:

宏的优点:a.复用性变强、b.宏函数提高效率,减少栈帧建立
宏的缺点:a.可读性差;b.没有类型的安全检查;c.不方便调试

在这里插入图片描述


C++引入了内联函数,在函数前加inline,在main函数调用的时候就会有选择性地展开!
在这里插入图片描述


如果函数调用次数过多,编译器就会选择不展开!
在这里插入图片描述
在这里插入图片描述

inline的特性 :如下(示例):

1.inline是一种以空间换时间的做法,省去函数栈帧额外开销。所以代码很长或者有循环/递归的函数不适宜使用内联函数。
2.inline对于编译器而言只是一个建议,编译器会自动优化。如果定义为inline的函数体内有函数内部实现代码指令长度比较长
  (10行左右,不同编译器不同)/递归等,编译器优化时会忽略掉内联。
3.inline不建议声明和定义分离,分离会导致链接错误,因为inline被展开,就没有函数地址了,链接就会找不到。

七、auto关键字

auto对于我们目前来说简单理解,后面学习会不断完善。
我们目前运用auto关键字可以:1.使用auto来遍历数组! 2.类型比较长时,auto自动推导

1.auto遍历数组方式 : 如下(示例):

// auto遍历数组
int main()
{
	// 旧版的遍历a数组 low
	int a[] = { 1,2,3,4,5,6,7,8,9,10 };
	for (int i = 0; i < sizeof(a) / sizeof(int); i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;

	// 运用范围for(auto关键字)自动依次取a的数据,赋值给e
	for (auto e : a)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

2.当类型比较长的时候,auto会自动推导!
在这里插入图片描述


这里要注意:auto自动识别的是数据类型,可以用来强调传参!
在这里插入图片描述


八、指针空值nullptr

C语言中空指针NULL为0,这样就会有些问题!
在这里插入图片描述
这里就会把NULL误认为是0,也就是int类型,C++之父为了解决这个问题,引入了nullptr关键字
在这里插入图片描述


总结

以上就是今天要讲的内容,本文简单介绍了C++相比于C语言新增的一些特性。缺省参数、函数重载、引用等特性!
如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/497816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【刷题之路】LeetCode 21. 合并两个有序链表

【刷题之路】LeetCode 21. 合并两个有序链表 1、题目描述二、解题1、方法1——直接合并1.1、思路分析1.2、代码实现 2、方法2——递归2.1、思路分析2.2、代码实现 1、题目描述 原题连接&#xff1a; 21. 合并两个有序链表 题目描述&#xff1a; 将两个升序链表合并为一个新的 …

Camtasia Studio2023Mac最新电脑版屏幕录像软件

Camtasia Studio2023提供了强大的屏幕录像、视频的剪辑和编辑、视频菜单制作、视频剧场和视频播放功能等。它能在任何颜色模式下轻松地记录屏幕动作&#xff0c;包括影像、音效、鼠标移动的轨迹&#xff0c;解说声音等等&#xff0c;另外&#xff0c;它还具有及时播放和编辑压缩…

数字化转型导师坚鹏:美的集团数字化转型案例研究

美的集团数字化转型案例研究 课程背景&#xff1a; 很多企业存在以下问题&#xff1a; 不清楚企业数字化转型能否成功&#xff1f; 不知道其它企业数字化转型的实际做法&#xff1f; 不知道其它企业的数字化转型战略是如何演变的&#xff1f; 课程特色&#xff1a; 用…

汽车架构-工作流程 以及相关协议解读

全车架构&#xff08;E/E&#xff09; 车载测试阶段&#xff1a; 台架测试 HIL测试&#xff08;硬件在环测试&#xff09; ADAS智能辅助驾驶测试 OTA测试&#xff08;远程升级测试&#xff09; 测试工具&#xff1a; Can协议工具&#xff1a;Canoe Pcan Zcanpro 辅助工具…

【Stable Diffusion】ControlNet基本教程(三)

接上篇【Stable Diffusion】ControlNet基本教程&#xff08;二&#xff09;&#xff0c;本篇再介绍两个ControlNet常见的基本用法&#xff0c;更多用法欢迎关注博主&#xff0c;博主还会更新更多有趣的内容。 3.3更换物体皮肤 有时&#xff0c;我们不想改变物体的轮廓&#xff…

毫米波雷达系列 | 传统CFAR检测(均值类)

毫米波雷达系列 | 传统CFAR检测&#xff08;均值类&#xff09; 文章目录 毫米波雷达系列 | 传统CFAR检测&#xff08;均值类&#xff09;1.CA-CFAR算法2.SO-CFRA算法3.GO-CFAR算法4.仿真对比 CFAR检测器主要用于检测背景杂波环境中的雷达目标&#xff0c;常见的均值类CFAR检测…

数据结构之队列的详解

文章目录 一.什么是队列二.队列的使用2.1 队列的基本操作2.2 队列的基本使用 三.队列的模拟实现3.1 数组实现队列3.2 链表实现队列 四.队列的应用4.1 设计循环队列4.2 设计双端队列4.3 队列实现栈4.4 栈实现队列 五.总结 一.什么是队列 队列是一种先入先出(FIFO)的线性表数据结…

点评项目导入

文章目录 开篇导读项目地址导入SQL项目架构介绍后端项目导入前端项目导入 开篇导读 实战篇我们要学习以下内容 短信登录 这一块我们会使用redis共享session来实现 商户查询缓存 通过本章节&#xff0c;我们会理解缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩等问题&…

力扣刷题Day12

239. 滑动窗口最大值 (此题逻辑真心牛皮&#xff09; 做此题之前&#xff0c;首先明确此题的目的。我最开始没搞明白此题目的&#xff0c;看代码的时候卡死。 copy他人代码&#xff1a; from collections import dequeclass MyQueue: #单调队列&#xff08;从大到小def __ini…

6.S081——陷阱部分(一文读懂Xv6系统调用)——xv6源码完全解析系列(5)

0.briefly speaking 这篇博客将要开始尝试阅读和研究与Xv6陷阱机制相关的代码&#xff0c;主要有以下文件&#xff0c;最重要的是结合Xv6 book将Xv6处理陷阱的相关逻辑和流程弄透。在Xv6的语境中所谓陷阱的触发有以下三种情况&#xff1a; 系统调用严重错误&#xff08;比如除…

windows守护进程工具--nssm使用

一、nssm简介 nssm是一个服务封装程序&#xff0c;它可以将普通exe程序封装成服务&#xff0c;实现开机自启动&#xff0c;同类型的工具还有微软自己的srvany&#xff0c;不过nssm更加简单易用&#xff0c;并且功能强大。 它的特点如下&#xff1a; 支持普通exe程序(控制台程序…

每天看一个fortran文件(7)之寻找cesm边界层高度计算代码

自从我把我的代码移到了单独的F90 中&#xff0c;从tphysac.F90中调用后。我发现有很多的变量我没办法调用了&#xff0c;特别是边界层中原先已经算好的变量&#xff0c;比如说我想调用原来模式中的pblh,但是那是在vertical diffusion.F90中计算的&#xff0c;在tphysac中根本调…

基于springcloud实现的医院信息系统

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 医疗信息就诊系统&#xff0c;系统主要功能按照数据流量、流向及处理过程分为临床诊疗、药品管理、财务管理、患者管理。诊疗活动由各工作站配合完成&#xff0c;并将临床信息进行整理、处理、汇总、统计、分析等。本系统包括以…

以前以为去流量大的部门是好事,能学技术,现在才知道,流量大的部门狗都不去!晚上9点才下班,一天到晚都是监控告警!...

流量大的部门好&#xff0c;还是流量小的部门好&#xff1f; 一位网友说&#xff0c;工作以前以为去流量大的部门是好事&#xff0c;能学技术&#xff1b;工作后才知道&#xff0c;流量大的部门和组&#xff0c;狗都不去&#xff01;待在流量大的组&#xff0c;晚上9点起步才下…

p71 内网安全-域横向网络传输应用层隧道技术

数据来源 必备知识点&#xff1a; 1、代理和隧道技术区别? 代理&#xff1a;只是解决网络的访问问题&#xff08;如&#xff1a;有些内网访问不到&#xff0c;可以用代理实现&#xff09; 隧道&#xff1a;隧道不仅是解决网络的通信问题&#xff0c;更大的作用是绕过过滤&…

菜刀、蚁剑以及冰蝎三款Webshell管理工具简介

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是菜刀、蚁剑以及冰蝎三款Webshell管理工具简介。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&…

YOLO(你只需看一眼)技术通讲(基于论文与开源代码)

YOLO通讲 前言YOLO v1论文及项目地址介绍模型架构统一检测边界框的置信度类置信度 网络设计训练 模型局限总结 YOLO v2模型改进正则化批处理使用高分辨率分类器卷积化锚盒维度聚类 前言 YOLO作为现在目标检测技术中较为基础且流行的技术之一。本文将以开源者的论文与模型为基础…

UE5实现物体高亮描边效果(含UE相关源码浅析)

文章目录 1.实现目标2.实现过程2.1 UE Editor中相关源码2.2 深度值描边2.3 半透明材质处理2.4 遮挡处理2.5 视口边缘处理3.参考资料1.实现目标 在UE5中实现物体边缘高亮效果,且在被遮挡时在边缘显示不同的颜色,当到达视口边缘时,也会将该物体与视口边缘相交的部分高亮。 2.…

纯比例控制为什么会存在稳态误差,用纯增益系统举例

warning: 本文仅为个人思考&#xff0c;非常不严谨甚至可能会出现严重错误&#xff0c;请读者仔细甄别&#xff0c;若本文真的存在严重错误&#xff0c;恳请评论区纠正&#xff0c;我看到将会考虑修改或者删除文章 纯比例控制存在稳态误差是由其本质&#xff08;控制逻辑&#…

从FPGA说起的深度学习(九)- 优化最终章

这是新的系列教程&#xff0c;在本教程中&#xff0c;我们将介绍使用 FPGA 实现深度学习的技术&#xff0c;深度学习是近年来人工智能领域的热门话题。 在本教程中&#xff0c;旨在加深对深度学习和 FPGA 的理解。 用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为…