函数重载与引用

文章目录
- 一、函数重载
- 1. 重载规则
- 2.重载列子
- 3.函数名修饰规则
- 二、引用
- 1.本质
- 2.特性
- 1. 引用必须在定义时初始化
- 2 . 一个变量可以有多个引用
- 3 . 引用一旦引用一个实体,就不能引用其他实体
- 3.引用例子
- 4.引用的权限
- 5.效率比较
- 6.指针跟引用的区别
一、函数重载
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或
类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
对于c语言是不允许重名函数的存在的,当函数名字相同时,就会报错。但是对于 c++ 可以。
因为C语言是根据函数名来去找函数的,可以简单的理解为C语言函数名就是地址
1. 重载规则
当函数重载条件满足如下三条时,则可以构成函数重载:
1.参数类型不同
2.参数个数不同
3.参数类型顺序不同
4、仅仅返回类型不同不足以称为函数重载的重载
5、需要在同一作用域下
2.重载列子
int add(int a, int b)
{return a + b;
}void add(int a, float b)
{cout << "add(int a,float b)" << endl;
}void add(float a, int b)
{cout << "add(float a,int b)" << endl;
}float add(float a, float b)
{return a + b;
}
3.函数名修饰规则
对于函数重载后的函数,执行会不会变慢?不会,因为不是在运行时匹配,而是在编译时。
编译时如何进行识别?
对于C语言来说,就是依靠函数名去找函数的,如果函数名相同,则会冲突,因为不知道找哪个
对于C++来说,是通过函数名+参数类型+参数个数+参数顺序
二、引用
-
引用的基本概念
- 引用是一个别名:引用是一个已存在变量的别名,通过引用可以访问原始变量的值。
- 引用必须初始化:引用在创建时必须进行初始化,并且一旦初始化后,它将一直引用同一个变量。
-
使用引用的好处
- 传递函数参数:通过引用传递参数,可以避免产生额外的复制开销,并且可以直接修改原始变量的值。
- 返回函数结果:函数可以返回引用类型,以便返回引用指向的变量,而不是复制一个新的副本。
- 在容器中使用引用:在使用STL容器时,使用引用可以避免元素的拷贝,提高效率。
-
引用与指针的比较
- 引用与指针类似,但有一些关键区别。引用是一个别名,而指针是一个变量,可以指向其他变量。
- 引用不能为空:引用在创建时必须进行初始化,并且不能重新赋值为空。
- 引用使用更方便:相比指针,引用语法更简洁明了,更容易理解和使用。
-
常量引用
- 常量引用是指对常量进行引用,即引用的变量不能被修改。
- 常量引用可以绑定到临时对象,以便在函数调用中传递临时对象的值。
-
引用作为返回类型
- 函数可以返回引用类型,在函数外部直接修改原始变量的值。
- 注意返回局部变量的引用可能导致悬空引用,应避免这种情况。
1.本质

我们发现a和b不仅值相等,连地址也是相同的。而这就说明,b 就是 a ,在语法层面上,这里 b 并不是开辟的新空间,而是对原来的 a 取了一个新名称,叫做 b
相当于一块空间有多个名字一样,都是指向这块空间的
而如果这时候对 a 或 b 任意一个修改,那么 a 和 b 都会发生修改。

2.特性
1. 引用必须在定义时初始化

2 . 一个变量可以有多个引用

3 . 引用一旦引用一个实体,就不能引用其他实体
int main()
{int a = 10;int& b = a;int c = 20;b = c;return 0;
}
那么这样又是什么意思呢
b引用了a,然后b=c是将c的值赋值给b
这就说明引用一旦引用一个实体,就不能引用其他实体,引用是不会发生改变的

3.引用例子
引用作为函数返回值
在Test函数当中定义了一个n,然后返回n的别名
在main函数当中用ret接受n的值
再打印ret,结果一直都是1
虽然Test()那块函数栈帧已经被销毁,但是我们使用int ret接受的n的值,并不是n
所以ret就是1
#include<iostream>using namespace std;
int& Test()
{int n = 1;return n;
}
int main()
{int ret = Test();cout << ret << endl;cout << ret << endl;cout << ret << endl;cout << ret << endl;return 0;
}

然后我们将ret换为int & 来接受
这时候ret就是n的别名
n出了函数作用域就销毁了,函数栈帧销毁了,但是里面的东西还没有被覆盖,传引用返回给ret的话,ret话会去访问原来n那块空间的值
函数调用先传参,所以调用cout的时候,ret先去访问n原来的那块空间,得到n值之后再给cout
cout函数会建立一块函数栈帧空间在原来的Count上,所以打印出1
第二次调用cout的时候,ret再去访问n的时候,原来的空间已经被破坏了,所以这一次打印出来的是随机值
#include<iostream>using namespace std;
int& Test()
{int n = 1;return n;
}
int main()
{int& ret = Test();cout << ret << endl;cout << ret << endl;cout << ret << endl;cout << ret << endl;return 0;
}

所以说如果用引用做返回值的话就需要确保返回的东西除了作用域是还存在的
4.引用的权限
#include<iostream>
using namespace std;
int main()
{int a = 1;int& b = a;const double& d = a;const int& c = 1;return 0;
}
对于类型转换,会先产生一个临时变量
然后临时变量具有常性,所以不可以被修改
所以double &d=a; 实际上并不是d去引用a
而是d去引用一个临时变量,所以需要+const去修饰
5.效率比较
#include <time.h>
struct A { int a[10000]; };
A a;
// 值返回
A TestFunc1() { return a; } // 拷贝
// 引用返回
A& TestFunc2() { return a; } // 不拷贝
void TestReturnByRefOrValue()
{// 以值作为函数的返回值类型size_t begin1 = clock();for (size_t i = 0; i < 100000; ++i)TestFunc1();size_t end1 = clock();// 以引用作为函数的返回值类型size_t begin2 = clock();for (size_t i = 0; i < 100000; ++i)TestFunc2();size_t end2 = clock();// 计算两个函数运算完成之后的时间cout << "TestFunc1 time:" << end1 - begin1 << endl;cout << "TestFunc2 time:" << end2 - begin2 << endl;
}int main()
{TestReturnByRefOrValue();return 0;
}
由于传值返回要拷贝,所以当拷贝量大,次数多时,比较耗费时间;而传引用返回就不会,因为返回的就是别名

6.指针跟引用的区别
-
定义和初始化:
- 指针:需要使用
*来声明,可以指向不同的对象。 - 引用:使用
&来声明,必须在初始化时绑定到一个已存在的变量。
- 指针:需要使用
-
空值(Null):
- 指针:可以具有空值(null),表示未指向有效的内存地址。
- 引用:不存在空引用的概念,必须绑定到一个已存在的变量。
-
变量绑定:
- 指针:可以在声明后重新指向其他变量。
- 引用:在声明时就必须绑定到一个变量,并且无法改变绑定对象。
-
空间占用:
- 指针:占用额外的内存空间,通常是4或8个字节。
- 引用:不占用额外的内存空间,只是变量的别名。
-
空间操作:
- 指针:可以进行算术运算和通过解引用操作符
*访问所指的内存地址的值。 - 引用:不能进行算术运算,直接访问绑定变量的值。
- 指针:可以进行算术运算和通过解引用操作符
-
空间限制和安全性:
- 指针:可以指向任意类型的对象,但需要注意空指针异常和野指针的问题。
- 引用:只能用于已存在的变量,更加简洁和安全。
int main()
{int a = 10;int& ra = a;ra = 20;int* pa = &a;*pa = 20;return 0;
}
相关文章:
函数重载与引用
文章目录 一、函数重载1. 重载规则2.重载列子3.函数名修饰规则 二、引用1.本质2.特性1. 引用必须在定义时初始化2 . 一个变量可以有多个引用3 . 引用一旦引用一个实体,就不能引用其他实体 3.引用例子4.引用的权限5.效率比较6.指针跟引用的区别 一、函数重载 函数重…...
如何快速模拟一个后端 API
第一步:创建一个文件夹,用来存储你的数据 数据: {"todos": [{ "id": 1, "text": "学习html44", "done": false },{ "id": 2, "text": "学习css", "…...
DLA :pytorch添加算子
pytorch的C extension写法 这部分主要介绍如何在pytorch中添加自定义的算子,需要以下cuda基础。就总体的逻辑来说正向传播需要输入数据,反向传播需要输入数据和上一层的梯度,然后分别实现这两个kernel,将这两个kernerl绑定到pytorch即可。 a…...
Java特殊时间格式转化
平常开发过程当中,我们可能会见到有的日期格式是这样的。 1、2022-12-21T12:20:1608:00 2、2022-12-21T12:20:16.0000800 3、2022-12-21T12:20:16.00008:00下面来说一下这种时间格式怎么转换 第一种:2022-12-21T12:20:1608:00 代码如下: p…...
在CSDN学Golang云原生(Kubernetes声明式资源管理Kustomize)
一,生成资源 在 Kubernetes 中,我们可以通过 YAML 或 JSON 文件来定义和创建各种资源对象,例如 Pod、Service、Deployment 等。下面是一个简单的 YAML 文件示例,用于创建一个 Nginx Pod: apiVersion: v1 kind: Pod m…...
后台管理系统中常见的三栏布局总结:使用element ui构建
vue2 使用 el-menu构建的列表布局: 列表可以折叠展开 <template><div class"home"><header><el-button type"primary" click"handleClick">切换</el-button></header><div class"conte…...
SpringCloud学习路线(10)——分布式搜索ElasticSeach基础
一、初识ES (一)概念: ES是一款开源搜索引擎,结合数据可视化【Kibana】、数据抓取【Logstash、Beats】共同集成为ELK(Elastic Stack),ELK被广泛应用于日志数据分析和实时监控等领域࿰…...
CSS翻转DIV展示顺序
项目国际化开发中,阿拉伯语是从右往左读的,在做样式兼容时,一些表单代码块也需要 label在右,表单在左。如果整个项目改div的话代价太大了,所以需要做样式翻转。 html <div class"container"><div …...
python 源码中 PyId_stdout 如何定义的
python 源代码中遇到一个变量名 PyId_stdout,搜不到在哪里定义的,如下只能搜到引用的位置(python3.8.10): 找了半天发现是用宏来构造的声明语句: // filepath: Include/cpython/object.h typedef struct …...
Mybatis映射关系mybatis核心配置文件
目录 1.Mybatis映射关系 1.1一对一映射之resultType 1.2resultMap处理映射关系 2.mybatis核心配置文件 1. properties(属性) 2. settings(设置) 3.typeAliases(类型别名) 4.environments࿰…...
Mybatis中limit用法与分页查询
错误示范 错误示范一: <select id"fileInspectionList" resultType"map">SELECT <include refid"aip_n_static_cols"/>FROM sys_inspection_form WHERE<if test" type admin.toString() ">dept_id …...
libcomposite: Unknown symbol config_group_init (err 0)
加载libcomposite.ko 失败 问题描述 如图,在做USB OTG 设备模式的时候需要用到libcomposite.ko驱动,加载失败了。 原因&解决方法 有一个依赖叫configfs.ko的驱动没有安装。可以从内核代码的fs/configfs/configfs.ko中找到这个驱动。先加载confi…...
Spring Tool Suite 4
参考:Spring tool suite4 安装及配置_springtoolsuite4_猿界零零七的博客-CSDN博客 下载:Spring | Tools 将下载的JAR进行解压两次,直至解压出contents中的sts 双击启动 第一次打开需要指定工作区文件夹 配置Maven的config 安装插件...
带你读论文第三期:微软研究员、北大博士陈琪,荣获NeurIPS杰出论文奖
Datawhale干货 来源:WhalePaper,负责人:芙蕖 WhalePaper简介 由Datawhale团队成员发起,对目前学术论文中比较成熟的 Topic 和开源方案进行分享,通过一起阅读、分享论文学习的方式帮助大家更好地“高效全面自律”学习&…...
农业中的计算机视觉 2023
物体检测应用于检测田间收割机和果园苹果 一、说明 欢迎来到Voxel51的计算机视觉行业聚焦博客系列的第一期。每个月,我们都将重点介绍不同行业(从建筑到气候技术,从零售到机器人等)如何使用计算机视觉、机器学习和人工智能来推动…...
掌握三个基础平面构成法则 优漫动游
1.图形重复:通过重复使用同一种或类似的图形元素,创造出一种有节奏、有重复感的视觉效果。这种设计手法可以使海报看起来更加统一和协调,增强视觉冲击力。 掌握三个基础平面构成法则 2.字体重复:通过重复使用同一种或类似的字体元素,创造出一种有序…...
叶工好容5-日志与监控
目录 前言 平台维度 docker运行状态 cAdvisor-日志采集者 Heapster-日志收集 metrics-server-出生决定成败 kube-state-metrics-不完美中的完美 应用维度 日志 部署方式 输出方式 工具选择 日志接入 监控 serviceMonitor Annotation Prometheus扩展性 Thanos …...
Dubbo 指定调用固定ip+port dubbo调用指定服务 dubbo调用不随机 dubbo自定义调用服务 dubbo点对点通信 dubbo指定ip
1. 在写分布式im时nami-im: 分布式im, 集群 zookeeper netty kafka nacos rpc主要为gate(长连接服务) logic (业务) lsb (负载均衡)store(存储) - Gitee.com,需要指定某一…...
BCNet论文精读
Title—标题 Boundary Constraint Network(边界约束网络) With Cross Layer Feature Integration(跨层特征融合) for Polyp Segmentation(息肉分割) 结构分析 标题结构由三部分组成,分别是本文…...
PHP8的注释-PHP8知识详解
欢迎你来到PHP服务网,学习《PHP8知识详解》系列教程,本文学习的是《PHP8的注释》。 什么是注释? 注释是在程序代码中添加的文本,用于解释和说明代码的功能、逻辑或其他相关信息。注释通常不会被编译器或解释器处理,而…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
Spring Boot 与 Kafka 的深度集成实践(二)
3. 生产者实现 3.1 生产者配置 在 Spring Boot 项目中,配置 Kafka 生产者主要是配置生产者工厂(ProducerFactory)和 KafkaTemplate 。生产者工厂负责创建 Kafka 生产者实例,而 KafkaTemplate 则是用于发送消息的核心组件&#x…...
