【C++】基础知识点回顾 中:函数重载、引用和内联函数

2023-11-08

前言

上篇文章我们介绍了C++基础知识中的命名空间、输入输出语句和缺省参数,
上篇文章点击这里
今天,我们就来学习函数重载与引用

函数重载

定义

在编写代码时,当出现多个函数名相同的函数时,C++提供了一种方式,函数重载,使得当人们想使用哪个函数时,就调用哪个函数

它允许我们在同一个作用域声明多个同名函数,但这些函数的参数类型或参数个数不同或参数顺序不同。
通过函数重载,我们可以用相同的函数名来表示不同的操作,从而提高代码的灵活性和可读性。

类型介绍

下面给出一些例子:

函数参数个数不同

int add(int a, int b, int c)
{
	return a + b + c;
}

int add(int a, int b)
{
	return a + b;
}

函数参数类型不同

int add(int a, int b, int c)
{
	return a + b + c;
}

int add(int a, double b, int c)
{
	return a + b + c;
}

函数参数顺序不同

int add(int b, double a, int c)
{
	return a + b + c;
}

int add(double a, int b, int c)
{
	return a + b + c;
}

注意:
我们并不考虑函数的返回类型是否不同
原因在后面会解释

重载规则

名称修饰

虽然看起来,上面那些函数的名称是一样的,但在编译过程中,编译器会根据这个函数的函数名和它的参数列表编码形成一个唯一的字符串,来表示这个函数。
这样,相同的函数名在编译后会变得不同,因此可以区分函数重载。

参数匹配

在编译时,编译器会根据传入的参数个数和类型来寻找合适的函数

函数调用解析

一旦编译器匹配到合适的函数声明,它就会生成对应的函数调用。
由于名称修饰的作用,函数的实际调用名可能与源代码中的函数名不完全相同。

注意

名称修饰的具体方式和规则在不同的编译器中可能有所不同,这也导致了不同编译器对函数重载的处理方式可能略有差异。
为了保持向后兼容性,C++提供了extern "C"的机制,用于在C++代码中声明使用C语言的函数名称修饰方式

导入

在学习C++一段时间之后,相信大家都接触到了引用,我们会发现,它和指针很像,这里就做一个对比

指针

我们都知道,指针实际上指的是指针变量,只不过我们口头说成指针而已,
指针就是地址,指针变量存放的就是一个地址

下面给出几个简单的应用示例

 int *p = NULL;
 int a = 0;
 int *pa = &a;

注意点

多提一句,对于野指针,也就是指向未知空间的指针变量,对它进行解引用操作是非法的
更详细的介绍,可以看我的另一篇文章
C语言知识点之指针

引用

下面,我们就来学习什么是引用

定义

引用不是新创建一个变量,而是对于已经存在的变量进行重命名,
编译器不会再单独为引用开辟一块空间,而是将引用和它所引用的变量存储到同一块空间里

格式

类型 &引用名 = 要引用的变量名;
下面给出一个例子

	int a = 0;
	int& b = a;

提示:
上面代码中的a和b是同一个变量,改变a就是改变b、改变b就是改变a

注意
引用和被引用的变量的类型要相同

引用的特性

1.引用为变量提供了一个别名。通过引用,我们可以使用不同的名称来访问同一个变量。

2.C++要求引用在声明时必须进行初始化,并且一旦初始化后就不能再改变其引用的对象
3.引用本身并不占用内存空间,它只是变量的一个别名。所以无法对引用获取地址
4. 引用在函数参数传递中特别有用,它可以通过引用来传递参数,以实现函数内部对参数的修改对原始变量的影响

引用和指针的区别

1.初始化和重新绑定:引用在声明时必须进行初始化,并且一旦初始化后就不能重新绑定到其他变量。而指针可以不进行初始化,并且可以重新指向其他变量。

2.空引用:C++不允许创建空引用,即引用必须绑定到一个已经存在的对象。但是,指针可以指向空(nullptr)。

3.语法:引用使用&符号进行声明,指针使用*符号进行声明。

4.内存占用:引用本身不占用额外的内存空间,而指针需要存储目标对象的地址,占用一定的内存空间。

常引用

常引用(const reference)是引用的一种特殊类型,在C++中用于限制通过引用访问的对象的修改。
通过将引用声明为常引用,我们告诉编译器,引用所指向的对象是只读的,不允许通过引用对对象进行修改。

常引用通过在引用声明中添加const关键字来实现,其声明形式为:

const T& ref = 引用实体;
//T是要引用的对象类型

特点

只读访问:通过常引用,我们只能读取所引用对象的值,不能修改它。任何试图通过常引用修改对象的操作都会导致编译错误。

初始化要求:常引用必须在声明时进行初始化,且只能引用一个同类型的变量或常量。

临时对象:常引用可以绑定到临时对象(右值),但由于临时对象在表达式结束后会被销毁,因此只能访问临时对象的值,不能修改。

应用

1.函数参数传递:通过引用传递参数,可以实现函数内部对原始变量的修改。简化使用指针。

void increment(int& x) {
    x++;
}
int num = 10;
increment(num);
// 现在num的值为11

2.返回值:函数可以通过引用返回结果,避免创建临时变量。

int& findLargest(int& a, int& b) {
    return (a > b) ? a : b;
}

int a = 10, b = 15;
int& largest = findLargest(a, b);
largest = 20;
// 现在b的值为20,即largest为b的引用

3.避免复制:引用可以避免对象的复制,提高代码的执行效率。

void processLargeObject(const LargeObject& obj) {
    // 处理大对象的操作,不需要复制对象
}

此处使用了常引用,代表在函数内不会对对象进行修改。

注意

在第二点做返回值时,要注意不能将临时变量引用返回

int& fun()
{
int a = 10;
return a;
}
例如此代码,变量a在函数执行结束之后便会被立刻销毁,若此时仍然根据引用去当作别名使用,对导致结果的不确定性,是不合法的操作。

内联函数

对于内联函数的介绍,可以看我之前的一篇文章

内联函数与快速读入

结语

关于函数重载、引用和内联函数的学习和介绍到这里就结束了,希望能对你有帮助。我们下次见~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】基础知识点回顾 中:函数重载、引用和内联函数 的相关文章

随机推荐

  • java自动化测试语言高级之LinkedList

    java自动化测试语言高级之LinkedList 文章目录 java自动化测试语言高级之LinkedList Java LinkedList Java LinkedList 链表 Linked list 是一种常见的基础数据结构 是一种线性
  • git之如何合并部分提交

    写在前面 在日常工作中经常会有这样的场景 在正常的功能开发中突然有紧急的bug修改 或者是紧急功能开发上线 在上线时又不能将正在开发中的功能合并到主干 此时我们就需要只合并需要紧急上线的代码到主干 接下来我们就看下这种情况如何处理 1 ch
  • Vuex中的mutations属性

    一 什么是mutations Mutation的中文翻译是 突变 在Vuex中 它是store对象的一个属性 mutations被用于更新store中所存放的所有状态 关于mutations 有以下几点需要注意 更改 Vuex 的 stor
  • 当人工智能遇上大数据 第九届中国云计算大会——大数据与人工智能应用论坛吸睛亮点集结...

    至顶网个人商用频道 06月10日 北京消息 文 黄雅琦 科技正在进入一个新的时代 这个时代的一个典型特征就是数据成为一种宝贵的资产 在海量的数据支撑之下科技越来越智能 不仅能 听懂 我们的语言 还能 看懂 我们的表情 帮我们做出更为科学的决
  • 〖Web全栈开发④〗— HTML基础详讲(超详细)

    HTML基础详讲 一 HTML基础 1 1浏览器发展史 1 2浏览器的诞生和发展 二 什么是网页 2 1 网站是什么 2 2 什么是网站 2 3 网站服务器 2 4 总结 三 HTML基础 3 1 什么是HTML 3 2 HTML标签 3
  • Mybatis一对多关系的分页结果数不准确的解决方法

    一次工作中一个业务 要求分页查询数据 每页10条 使用MySQL Mybatis组合 但是查出结果却出现有的页少于10条 但是直接执行SQL的确查出10条 这可真是奇了怪了 还好通过网上和讨论后确定了是Mybatis的分页逻辑的问题 原因
  • GB/T28181设备接入端如何应用到数字城管场景?

    什么是数字城管 数字城管 又称 数字化城市管理 或 智慧城管 是一种采用信息化手段和移动通信技术来处理 分析和管理整个城市的所有城管部件和城管事件信息 促进城市管理现代化的信息化措施 数字城管通过建立城市管理信息化平台 实现城市管理信息的采
  • 使用正则表达式获取原始图片

    使用正则表达式适合于页面源码返回JSON数据 无论是在HTML里还是在
  • C++容器——list的模拟实现

    目录 一 list的基本结构 二 接下来就是对list类构造函数的设计了 三 链表数据的增加 四 接下来就是迭代器的创建了 四 简单函数的实现 五 构造与析构 六 拷贝构造和赋值重载 传统写法 现代写法 七 迭代器模板类型 一 list的基
  • sshpass工具+ssh登录方式

    自动登录 ssh工具 sshpass 一般用在sh脚本中 无须再次输入密码 本机known hosts文件中有的主机才能生效 它允许你用 p 参数指定明文密码 然后直接登录远程服务器 它支持密码从命令行 文件 环境变量中读取 yum ins
  • 基于相关性(NCC)的模板匹配Halcon

    一 原理 归一化相关性 NCC normalization cross correlation 顾名思义 就是用于归一化待匹配目标之间的相关程度 注意这里比较的是原始像素 通过在待匹配像素位置p px py 构建3 3邻域匹配窗口 与目标像
  • Leet14. 最长公共前缀

    编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀 返回空字符串 示例 1 输入 strs flower flow flight 输出 fl 示例 2 输入 strs dog racecar car 输出 解释 输入不存在公共
  • 经验:初次接触全差分放大器时易犯的错误

    经验 初次接触全差分放大器时易犯的错误 更新历史 201901222 首次发布 本人当年第一次接触全差分放大器时 曾犯过一个低级的错误 导致对全差分放大器进行PSPICE仿真时 输出的波形总是不对 在后来的日子里 不止一次地看到其他人犯相同
  • GPT-3不算机器学习算法创新?2020年AI顶会最佳论文榜单引发激烈争论

    贾浩楠 发自 凹非寺 量子位 报道 公众号 QbitAI 2020年的最后一天 来回顾一下今年所有AI顶会的最佳论文吧 今年 顶会的最佳论文 既有ECCV的 2D变3D 的NeRF 当然 也有今年引起轰动的GPT 3 它来自NeurIPS
  • openGL之API学习(一七八)glsl版本功能演变

    GLSL 120 增加 1 你可以在着色器中初始化数组 如下所示 1 2 float a 5 float 5 3 4 4 2 5 0 5 2 1 1 float b 5 float 3 4 4 2 5 0 5 2 1 1 然而 即使使用GL
  • 从数据库中读取时间相差八个小时及格式不正确问题

    前端从数据库中读取时间数据的时候 需要关心的有格式问题和时间不一致问题 1 格式问题 有时读取时间数据是一长串的long类型数字 此数字表示的是自从公元年开始到现在所过的时间长度 此时在domain中 需要观察自己书写的时间对应类型是否写成
  • intel性能测试工具VTune的功能和用法介绍

    转自 https blog csdn net WY stutdy article details 79106501 https software intel com en us node 256997 1 VTune介绍 VTune可视化性
  • springboot将http改造成https

    springboot的项目天然的就是http的 但是有时候客户觉得http不安全 想要使用https的请求访问怎么处理 话不多少 上重点 https是对http进行ssl加密的一种协议 简单来说就是更安全 那么要怎么做呢 首先要生成证书 这
  • 看板的六大实践学习总结

    这次活动主要是学习看板的实践 看板的六大实践介绍如下 可视化 可视化价值项和价值流 story和它的流动 将问题和 瓶颈也在看板上可视化 可激发团队协作 限制在制品 通过限制各阶段的在实现的story 来加速流动 避免造成 交通 阻塞 考虑
  • 【C++】基础知识点回顾 中:函数重载、引用和内联函数

    前言 上篇文章我们介绍了C 基础知识中的命名空间 输入输出语句和缺省参数 上篇文章点击这里 今天 我们就来学习函数重载与引用 函数重载 定义 在编写代码时 当出现多个函数名相同的函数时 C 提供了一种方式 函数重载 使得当人们想使用哪个函数