【C++】入门C++(中)
好的,我们继续,这是 C++专栏的第二篇博客,还没读过上一篇博客可以进入我创建的专栏阅读
入门C++(上)再回来哦~
下面我们要讲的第一个概念就是函数重载
函数重载
1. 函数重载概念
什么是函数重载? 简单来说,函数重载就是一词多义 下面给出它的详细定义
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题
注意:不同作用域可以随便同名
同一作用域要同名,则需要满足重载的规则
下面我们来看一下几个构成函数重载的例子:
1.参数个数不同
2.参数类型不同
3.参数类型顺序不同
然后我们再来看一下下面的代码:
为什么这里会报错?
可以肯定的是这是不需要重载关系也是ok的(因为不同作用域可以随便同名)
但是在这里发生了调用歧义 所以才会报错~
再看一个例子:
这里的函数虽然构成重载,但是它们的调用会有歧义
我们再看一个例子:
这里我们可以得出:返回值不同是无法构成重载的
因为返回值不同,无法区分,所以返回值不是重载的条件
综上所属,调用里面中有歧义的都是不行的
最后,关于函数的重载,我们需要记住,它一定是和形参的类型是有关系的
还有就是将调用歧义和函数重载 区分开来
2.C++支持函数重载的原理
所以为什么C++支持函数重载,而C语言不支持函数重载呢?
在这里简单介绍一下:
对于C语言不支持函数重载我们是可以很好理解的,这与之前我们在C语言中讲过的编译链接过程有关 :一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接
链接时:
1.C语言是直接用函数名字去查找函数的地址的,所以不支持函数重载
2.在C++中,是用修饰后的函数名字去查找的,只要参数不同,修饰出来的名字就不一样,所以就支持函数重载
但是在如果我们在调用时不指定返回值类型,那么我们并不知道调函数的哪个返回值,就是调用时有了歧义,无法区分
所以对于C++的函数重载而言,函数返回值不同并不能构成函数重载,因为这不是函数名修饰规则
这也印证了我们在之前说的函数重载与 参数个数 或 类型 或 类型顺序 三者有关
接下来我们来看一下引用
引用
1. 引用概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间
引用的形式: 类型 & 引用变量名 = 引用实体
举个例子:
注意:引用类型必须和引用实体是同种类型的
2. 引用特性
1.引用在定义时必须初始化
2.一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体
对于第一个特性,其实很好理解,我们看下面的这行代码
int& a; // 该条语句编译时会出错
对于这里的第二个特性,可以看下面的代码:
我们发现,这里的a,b,c,d都是同一个东西
然后是第三个特性,我们看下面的代码:
int main()
{int x = 0;int& y = x;int z = 1;y = z;return 0;
}
这里是 y变成z的别名呢? 还是z赋值给y?
根据引用的第三个特性:引用一旦引用一个实体,再不能引用其他实体
所以这里的代码y = z 意思是将 z赋值给y
我们可以验证一下:
3. 常引用
我们来看一下下面的代码:
const int a = 10;int& ra = a;
该语句编译时会出错,
因为a经过const修饰后是只读的
而ra变成a的别名,ra的权限是可读可写的
这是一种权限的放大,即原来 只是可读的变成的 可读可写的 所以不可以
总之,这里我们需要知道,权限不能放大
再看下面的代码:
const int* p1 = &m;
int* p2 = p1;
该语句编译时也会出错,这也是权限的放大
因为 const修饰是的*p1 , 所以 p1可以修改 *p1不可以
而int* p2 = p1 ,如果我们改变*p2,那么*p1就也会被修改,所以不可以
对应的,我们可以将 int* p2 = p1 修改为 const int& p2 = p1 这样就是权限的平移,是可以的
再看一个代码:
int* p1 = &x;const int* p2 = p1;
这是可以的,
p1是可读可写的,p2只可读
这是一种权限的缩小,即原来可读可写的变成了只可读 所以可以
这里我们可以知道,权限可以缩小
看下面代码:
double d = 12.34;
int& rd = d;
int& rd = d; 该语句编译时会出错,这是为什么呢?仅仅因为类型不同吗?
可是如果我换成 const int& rd = d 就不会报错,这又是为什么呢?
这里其实会进行一个类型的转换,而类型转换又会生成临时变量
知道了这点,我们就可以分析其中的原因了,int& rd = d 这里要将d给rd,这里是要类型转换的,而类型转换又需要临时变量,所以其实rd引用的不是d,而是那个临时变量
我们还知道,临时变量具有常性(相当与const修饰),所以这里的int& rd = d存在权限的放大
而我们将nt& rd = d 改成 const int& rd = d ,就不会是权限的放大,而是权限的平移,所以可以
总结一下,权限可以缩小,可以平移,但绝不可以放大!
4.使用场景
做参数
void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
这里我们用引用的话就不用像C语言那样去传指针了,就会变得更加的方便~
而关于做返回值的使用场景,我们暂且不讲,留到以后讲类和对象时再说~
5. 传值、传引用效率比较
下面我们用一段代码看一下传值和传引用效率上的区别:
#include <time.h>
struct A{ int a[10000]; };void TestFunc1(A a){}
void TestFunc2(A& a){}void TestRefAndValue()
{
A a;
// 以值作为函数参数
size_t begin1 = clock();
for (size_t i = 0; i < 10000; ++i)
TestFunc1(a);
size_t end1 = clock();
// 以引用作为函数参数
size_t begin2 = clock();
for (size_t i = 0; i < 10000; ++i)
TestFunc2(a);
size_t end2 = clock();
// 分别计算两个函数运行结束后的时间
cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}
(Tips:第二个函数运行的时间为0是取整后的结果,表示运行时间不超过1ms)
通过上述代码的比较,我们由此发现传值和指针在作为传参上效率相差很大
我们也能感知到引用传参的一个极大的好处
6.引用和指针的区别
讲到这里,引用的知识差不多就介绍完了,最后我们来简单的对比一下:
引用和指针的不同点:
1. 在语法上,我们认为引用定义一个变量的别名,指针存储一个变量地址
所以在语法层面上,我们认为引用不开空间(比如:int & b = a;),而指针是要开空间的
(比如: int * p = &a;) (但是在底层,其实它们是一样的,都是指针)
2. 引用在定义时必须初始化,指针没有要求
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何
一个同类型实体
4. 没有NULL引用,但有NULL指针(但这个也不是绝对的,比如说 int* ptr = NULL;
int& r = *ptr; 这里看起来对空指针解引用,但是不会报错,因为在底层其实只是存ptr的地址,没有解引用,不过如果我们接下来要访问 :cout<< r<<endl; 才会解引用)
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
位平台下占4个字节,64位平台下占8个字节)
比如我们看下面的代码及运行结果:
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
7. 有多级指针,但是没有多级引用
8. 访问实体方式不同,指针需要显式解引用,引用 是编译器自己处理(因为引用底层也是指针,但是它解引用不需要显式处理)
9. 引用比指针使用起来相对更安全(所以在C++我们更倾向用引用)
结语
好啦,这篇C++入门中篇的博客就先写到这里吧 我们介绍了C语言没有的两个新的概念:函数重载和引用,希望大家能有所收获~
如果文中分析,题解代码有不足的地方欢迎大家在评论区讨论和指正
接下来我也会持续更新与C++相关内容的博客
让我们在接下来的时间里一起学习,一起进步吧~
相关文章:

【C++】入门C++(中)
好的,我们继续,这是 C专栏的第二篇博客,还没读过上一篇博客可以进入我创建的专栏阅读 入门C(上)再回来哦~ 下面我们要讲的第一个概念就是函数重载 函数重载 1. 函数重载概念 什么是函数重载? 简单来说…...

javaIO
file类 一个File类的对象可以表示一个具体的文件或目录 mkdir 创建单级文件夹 mkdirs 创建多级文件夹 delete 删除一个文件夹时,文件夹里面必须是空的 listfiles 将文件夹的子集放到一个file类型的数组中 输入及输出的概念 输入input 输出output 把jav…...

睿尔曼超轻量仿人机械臂之复合机器人底盘介绍及接口调用
机器人移动平台是一个包含完整成熟的感知、认知和定位导航能力的轮式机器人底盘产品级平台,产品致力于为各行业细分市场的商用轮式服务机器人提供一站式移动机器人解决方案,让合作伙伴专注在核心业务/人机交互的实现。以下是我司产品双臂机器人以及复合升…...

用JSch实现远程传输文件并打包成jar
本文将简单介绍一下 JSch 这个Java的第三方库的一个简单用法,并以此为实例,讲解 IntelliJ 中打包成 jar 包的2种方式。 实现目标 我们的目标是,做出一个jar包,它能够实现类似于 scp 命令的远程传输文件的功能。用法如下…...

2023年第十四届蓝桥杯大赛软件类省赛C/C++研究生组真题(代码完整题解)
C题-翻转⭐ 标签:贪心 简述:如果 S 中存在子串 101 或者 010,就可以将其分别变为 111 和 000,操作可以无限重复。最少翻转多少次可以把 S 变成和 T 一样。 链接: 翻转 思路:要求步骤最少->S每个位置最多修改一次->从头开始遍历不匹配就翻转->翻转不了就-1 …...

力扣刷题Days28-第二题-11.盛水最多的容器(js)
目录 1,题目 2,代码 3,学习与总结 3.1思路回顾 1,如何遍历 2,算法流程 3.2剖析问题 1,题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, h…...

文生图大模型三部曲:DDPM、LDM、SD 详细讲解!
1、引言 跨模态大模型是指能够在不同感官模态(如视觉、语言、音频等)之间进行信息转换的大规模语言模型。当前图文跨模态大模型主要有: 文生图大模型:如 Stable Diffusion系列、DALL-E系列、Imagen等 图文匹配大模型:如CLIP、Chinese CLIP、…...

算法学习——LeetCode力扣动态规划篇10(583. 两个字符串的删除操作、72. 编辑距离、647. 回文子串、516. 最长回文子序列)
算法学习——LeetCode力扣动态规划篇10 583. 两个字符串的删除操作 583. 两个字符串的删除操作 - 力扣(LeetCode) 描述 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个…...

TASKPROMPTER
baseline模型的预训练权重就有1.6G! 多吓人呐,当时我就暂停下载了,不建议复现...

C之易错注意点转义字符,sizeof,scanf,printf
目录 前言 一:转义字符 1.转义字符顾名思义就是转换原来意思的字符 2.常见的转义字符 1.特殊\b 2. 特殊\ddd和\xdd 3.转义字符常错点----计算字符串长度 注意 : 如果出现\890,\921这些的不是属于\ddd类型的,,不是一个字符…...
等级保护测评无补偿因素的高风险安全问题判例(共23项需整改)
层面 控制点 要求项 安全问题 适用范围 充分条件 整改建议简要 安全物理环境 基础设施位置 应保证云计算基础设施位于中国境内 1.云计算基础设施物理位置不当 二级及以上 相关基础设施不在中国境内 云平台相关基础设施在中国境内部署 安全通信网络 网络架构 应…...
JavaScript笔记 09
目录 01 DOM操作事件的体验 02 获取元素对象的五种方式 03 事件中this指向问题 04循环绑定事件 05 DOM节点对象的常用操作 06 点亮盒子的案例 07 节点访问关系 08 设置和获取节点内容的属性 09 以上内容的小总结 01 DOM操作事件的体验 js本身是受事件驱动的脚本语言 什…...

操作教程|在MeterSphere中通过SSH登录服务器的两种方法
MeterSphere开源持续测试平台拥有非常强大的插件集成机制,用户可以通过插件实现平台能力的拓展,借助插件或脚本实现多种功能。在测试过程中,测试人员有时需要通过SSH协议登录至服务器,以获取某些配置文件和日志文件,或…...
Swashbuckle.AspNetCore介绍
使用 ASP.NET Core 构建的 API 的 Swagger 工具。直接从您的路由、控制器和模型生成精美的 API 文档,包括用于探索和测试操作的 UI。 除了 Swagger 2.0 和 OpenAPI 3.0 生成器外,Swashbuckle 还提供了由生成的 Swagger JSON 提供支持的令人敬畏的 swagg…...
【Spring】通过Spring收集自定义注解标识的方法
文章目录 前言1. 声明注解2. 使用 Spring 的工厂拓展3. 收集策略4. 完整的代码后记 前言 需求: 用key找到对应的方法实现。使用注解的形式增量开发。 MyComponent public class Sample1 {MyMethod(key "key1")public String test2() {return "She…...

基于深度学习的图书管理推荐系统(python版)
基于深度学习的图书管理推荐系统 1、效果图 1/1 [] - 0s 270ms/step [13 11 4 19 16 18 8 6 9 0] [0.1780757 0.17474999 0.17390694 0.17207369 0.17157653 0.168248440.1668652 0.16665359 0.16656876 0.16519257] keras_recommended_book_ids深度学习推荐列表 [9137…...

MATLAB 点云随机渲染赋色(51)
MATLAB 点云随机渲染赋色(51) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 为点云中的每个点随机赋予一种颜色,步骤和效果如图: 1、读取点云 (ply格式) 2、随机为每个点的RGB颜色字段赋值 3、保存结果 (ply格式) 二、算法实现 1.代码 代码如下(示例):…...
通过一篇文章让你完全掌握VS和电脑常用快捷键的使用方法
VS常用快捷键 前言一、 VS常用快捷键常用VS运行调试程序快捷键常用VS编辑程序快捷键 二、常用windows系统操作快捷键 前言 VS(Visual Studio)是一款强大的开发工具,提供了许多常用快捷键,以提高开发效率。这些快捷键包括文件操作…...
ChatGPT指引:借助ChatGPT撰写学术论文的技巧
ChatGPT无限次数:点击直达 ChatGPT指引:借助ChatGPT撰写学术论文的技巧 在当今信息技术高度发达的时代,人工智能技术的不断发展为学术研究者提供了更多的便利和可能。其中,自然语言处理技术中的ChatGPT无疑是一种强大的工具,它能…...

魔改一个过游戏保护的CE
csdn审核不通过 网易云课堂有配套的免费视频 int0x3 - 主页 文章都传到github了 Notes/外挂/魔改CE at master MrXiao7/Notes GitHub 为什么要编译自己的CE 在游戏逆向的过程中,很多游戏有保护,我们运行原版CE的时候会被检测到 比如我们开着CE运…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...