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

news2024/11/24 23:07:48

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/499591.html

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

相关文章

从一到无穷大 #8 Arrow,Parquet and ORC

文章目录 引言ArrowParquetNested EncodingRepetition LevelsDefinition Levels 列化压缩 ORC 引言 以我的机器为例来做一个简单的计算&#xff1a; 执行cat /proc/cpuinfo |grep MHz|uniq可以看到目前机器中CPU频率&#xff0c;得到值 2494.140MHZ&#xff5e;2494140000HZ&…

【算法】——全排列算法讲解

前言&#xff1a; 今天&#xff0c;我给大家讲解的是关于全排列算。我会从三个方面去进行展开&#xff1a; 首先&#xff0c;我会给大家分析关于全排列算法的思想和定义&#xff1b;紧接着通过手动实现出一个全排列代码来带大家见见是怎么实现的&#xff1b;最后我会给出两道题…

ESP32单片机入门篇

目录 一、ESP32单片机的基本概念 1.双核架构 2. Wi-Fi和蓝牙功能 3. 集成多种外设 4. 支持多种操作系统 二、开发环境 1. Arduino IDE 2. ESP-IDF 三、开发语言 四、注意事项 五、代码例程 &#xff08;1&#xff09;点亮LED灯 1. 电路图 2. 代码 3. 代码注释 …

【精品】Java-Stream流详解

Java-Stream流详解 如何学会JDK8中的Stream流&#xff0c;用它来提高开发效率&#xff1f;创建不可变的集合&#xff08;Immutable 不可变的&#xff09;场景方法 初试 Stream 流Stream 流的思想Stream 流的作用Stream 流的使用步骤Stream 流的中间方法Stream 流的终结方法 如何…

STM32:利用PWM波控制飞盈电调过程和注意事项

STM32&#xff1a;利用PWM波控制电调过程和注意事项 在进行模型控制的过程中&#xff0c;如四旋翼无人机等&#xff0c;需要用到电机&#xff0c;这些电机需要通过电调来控制电机的转速。在电调模块中带有的说明书一般都是利用遥控器进行控制&#xff0c;有些情况需要自己通过…

【自然语言处理】【大模型】CodeGeeX:用于代码生成的多语言预训练模型

CodeGeeX&#xff1a;用于代码生成的多语言预训练模型 《CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Evaluations on HumanEval-X》 论文地址&#xff1a;https://arxiv.org/pdf/2303.17568.pdf 相关博客 【自然语言处理】【大模型】CodeGeeX&#…

二叉排序树

二叉排序树 文章目录 二叉排序树创建遍历删除完整代码 假如给你一个数列 (7, 3, 10, 12, 5, 1, 9)&#xff0c;要求能够高效的完成对数据的查询和添加。 使用数组 数组未排序&#xff1a; 优点&#xff1a;直接在数组尾添加&#xff0c;速度快。 缺点&#xff1a;查找速度慢. 数…

[图形学] 射线和线段之间的最小距离

1 说在前面 本文的主要内容来自于Unity引擎中Spline功能的一个函数&#xff0c;一开始我难以理解这几个向量运算的作用和几何意义&#xff0c;经过一番思考后总结如下&#xff1a; 该段代码实际上更像是两个直线之间寻找最短距离&#xff0c;然后判断该距离对应的点在其中一条…

STM32利用USB的HID与QT上位机通信

之前使用kingst的逻辑分析仪&#xff0c;打开上位机软件&#xff0c;插上带usb的硬件就可以通信&#xff0c;也不需要打开串口什么的&#xff0c;感觉很方便&#xff0c;于是借用一个周末研究下这个技术。本文主要是用于记录自己学习的过程&#xff0c;顺便分享下学习感悟。 首…

大数据周会-本周学习内容总结012

开会时间&#xff1a;2023.05.07 16:00 线下会议 目录 01【es数据同步至mysql】 1.1【在es中插入数据后能够同步到mysql中】 1.2【修改与删除es中的数据】 02【nifi】 2.1【Nifi的单机及分布式集群部署】 2.2【nifi集群&#xff0c;getFile简单使用nifi】 2.3【nifi使用…

如何利用Requestly提升前端开发与测试的效率,让你事半功倍?

痛点 前端测试 在进行前端页面开发或者测试的时候&#xff0c;我们会遇到这一类场景&#xff1a; 在开发阶段&#xff0c;前端想通过调用真实的接口返回响应在开发或者生产阶段需要验证前端页面的一些 异常场景 或者 临界值 时在测试阶段&#xff0c;想直接通过修改接口响应来…

Nuvoton NK-980IOT开发板 u-boot 编译

前言 最近搭建了 Nuvoton NK-980IOT开发板 的开发编译环境&#xff0c;记录一下 u-boot 的 编译流程 Nuvoton NK-980IOT开发板 资源还是比较的丰富的&#xff0c;可以用于 嵌入式Linux 或者 RT-Thread 的学习开发 开发板上电比较的容易&#xff0c;两根 USB 线即可&#xff0…

进程与线程(二)

进程同步、进程互斥 同步亦称直接制约关系&#xff0c;是指为完成某种任务而建立的两个或多个进程&#xff0c;这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于他们之间的相互合作。 操作系统要提供“进程同步机制”来解决异…

Oracle的学习心得和知识总结(二十四)|Oracle数据库DBMS程序包解密方法及SQL Developer和Unwrapper的安装与使用

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

android 隐藏底部虚拟按键

方法一 滑动屏幕 可重新显示出来 protected void hideBottomUIMenu() { //隐藏虚拟按键&#xff0c;并且全屏 if (Build.VERSION.SDK_INT <11 && Build.VERSION.SDK_INT < 19) { // lower api View v this.getWindow().getDecorView(); v.setSyst…

大众软件组织人事地震:传董事会被裁,5000人的CARIAD何去何从?

作者 | 德新 编辑 | 王博 外媒Business Insider近日爆出一则重磅消息&#xff1a;大众汽车集团CEO Oliver Blume&#xff08;奥博穆&#xff09;有意裁掉旗下软件组织CARIAD的整个董事会。其影响的高层包括&#xff0c;CARIAD CEO Dirk Hilgenberg、CTO Lynn Longo&#xff0c;…

influxdb时序型数据库基础

文章目录 什么是InfluxDB时序数据特点常见应该场景时序数据库解决什么问题InfluxDB的优势InfluxDB常用命令 什么是InfluxDB InfluxDB是一个开源的、高性能的时序型数据库&#xff0c;在时序型数据库DB-Engines Ranking上排名第一。 在介绍InfluxDB之前&#xff0c;先来介绍下…

机器学习随记(5)—决策树

手搓决策树&#xff1a;用决策树将其应用于分类蘑菇是可食用还是有毒的任务 温馨提示&#xff1a;下面为不完全代码&#xff0c;只是每个步骤代码的实现&#xff0c;需要完整跑通代码的同学不建议花时间看&#xff1b;适合了解决策树各个流程及代码实现的同学复习使用。 1 数据…

MySQL锁机制

目录 表级锁&行级锁 排他锁&共享锁 InnoDB行级锁 行级锁&#xff08;record lock&#xff09;&#xff1a; 间隙锁&#xff08;gap lock&#xff09;&#xff1a; 意向锁 InnoDB表级锁 MVCC&#xff08;多版本并发控制&#xff09; 已提交读的MVCC&#xff1a…

Linux下的shell

NC反向shell 1、查看shell类型 echo $SHELLchsh -s 需要修改shell的类型cat /etc/shells 查看存在哪些shell 然后反弹对应的shell&#xff08;正向连接&#xff09; //被控制端 nc -lvvp 8989 -e /bin/bash //控制端 nc 192.168.222.146(被控端ip) 8989 2、没有-e参数反…