当前位置: 首页 > news >正文

函数重载与引用

在这里插入图片描述

文章目录

    • 一、函数重载
      • 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++来说,是通过函数名+参数类型+参数个数+参数顺序

二、引用

  1. 引用的基本概念

    • 引用是一个别名:引用是一个已存在变量的别名,通过引用可以访问原始变量的值。
    • 引用必须初始化:引用在创建时必须进行初始化,并且一旦初始化后,它将一直引用同一个变量。
  2. 使用引用的好处

    • 传递函数参数:通过引用传递参数,可以避免产生额外的复制开销,并且可以直接修改原始变量的值。
    • 返回函数结果:函数可以返回引用类型,以便返回引用指向的变量,而不是复制一个新的副本。
    • 在容器中使用引用:在使用STL容器时,使用引用可以避免元素的拷贝,提高效率。
  3. 引用与指针的比较

    • 引用与指针类似,但有一些关键区别。引用是一个别名,而指针是一个变量,可以指向其他变量。
    • 引用不能为空:引用在创建时必须进行初始化,并且不能重新赋值为空。
    • 引用使用更方便:相比指针,引用语法更简洁明了,更容易理解和使用。
  4. 常量引用

    • 常量引用是指对常量进行引用,即引用的变量不能被修改。
    • 常量引用可以绑定到临时对象,以便在函数调用中传递临时对象的值。
  5. 引用作为返回类型

    • 函数可以返回引用类型,在函数外部直接修改原始变量的值。
    • 注意返回局部变量的引用可能导致悬空引用,应避免这种情况。

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.指针跟引用的区别

  1. 定义和初始化:

    • 指针:需要使用*来声明,可以指向不同的对象。
    • 引用:使用&来声明,必须在初始化时绑定到一个已存在的变量。
  2. 空值(Null):

    • 指针:可以具有空值(null),表示未指向有效的内存地址。
    • 引用:不存在空引用的概念,必须绑定到一个已存在的变量。
  3. 变量绑定:

    • 指针:可以在声明后重新指向其他变量。
    • 引用:在声明时就必须绑定到一个变量,并且无法改变绑定对象。
  4. 空间占用:

    • 指针:占用额外的内存空间,通常是4或8个字节。
    • 引用:不占用额外的内存空间,只是变量的别名。
  5. 空间操作:

    • 指针:可以进行算术运算和通过解引用操作符*访问所指的内存地址的值。
    • 引用:不能进行算术运算,直接访问绑定变量的值。
  6. 空间限制和安全性:

    • 指针:可以指向任意类型的对象,但需要注意空指针异常和野指针的问题。
    • 引用:只能用于已存在的变量,更加简洁和安全。
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 . 引用一旦引用一个实体&#xff0c;就不能引用其他实体 3.引用例子4.引用的权限5.效率比较6.指针跟引用的区别 一、函数重载 函数重…...

如何快速模拟一个后端 API

第一步&#xff1a;创建一个文件夹&#xff0c;用来存储你的数据 数据&#xff1a; {"todos": [{ "id": 1, "text": "学习html44", "done": false },{ "id": 2, "text": "学习css", "…...

DLA :pytorch添加算子

pytorch的C extension写法 这部分主要介绍如何在pytorch中添加自定义的算子&#xff0c;需要以下cuda基础。就总体的逻辑来说正向传播需要输入数据&#xff0c;反向传播需要输入数据和上一层的梯度&#xff0c;然后分别实现这两个kernel,将这两个kernerl绑定到pytorch即可。 a…...

Java特殊时间格式转化

平常开发过程当中&#xff0c;我们可能会见到有的日期格式是这样的。 1、2022-12-21T12:20:1608:00 2、2022-12-21T12:20:16.0000800 3、2022-12-21T12:20:16.00008:00下面来说一下这种时间格式怎么转换 第一种&#xff1a;2022-12-21T12:20:1608:00 代码如下&#xff1a; p…...

在CSDN学Golang云原生(Kubernetes声明式资源管理Kustomize)

一&#xff0c;生成资源 在 Kubernetes 中&#xff0c;我们可以通过 YAML 或 JSON 文件来定义和创建各种资源对象&#xff0c;例如 Pod、Service、Deployment 等。下面是一个简单的 YAML 文件示例&#xff0c;用于创建一个 Nginx Pod&#xff1a; apiVersion: v1 kind: Pod m…...

后台管理系统中常见的三栏布局总结:使用element ui构建

vue2 使用 el-menu构建的列表布局&#xff1a; 列表可以折叠展开 <template><div class"home"><header><el-button type"primary" click"handleClick">切换</el-button></header><div class"conte…...

SpringCloud学习路线(10)——分布式搜索ElasticSeach基础

一、初识ES &#xff08;一&#xff09;概念&#xff1a; ES是一款开源搜索引擎&#xff0c;结合数据可视化【Kibana】、数据抓取【Logstash、Beats】共同集成为ELK&#xff08;Elastic Stack&#xff09;&#xff0c;ELK被广泛应用于日志数据分析和实时监控等领域&#xff0…...

CSS翻转DIV展示顺序

项目国际化开发中&#xff0c;阿拉伯语是从右往左读的&#xff0c;在做样式兼容时&#xff0c;一些表单代码块也需要 label在右&#xff0c;表单在左。如果整个项目改div的话代价太大了&#xff0c;所以需要做样式翻转。 html <div class"container"><div …...

python 源码中 PyId_stdout 如何定义的

python 源代码中遇到一个变量名 PyId_stdout&#xff0c;搜不到在哪里定义的&#xff0c;如下只能搜到引用的位置&#xff08;python3.8.10&#xff09;&#xff1a; 找了半天发现是用宏来构造的声明语句&#xff1a; // filepath: Include/cpython/object.h typedef struct …...

Mybatis映射关系mybatis核心配置文件

目录 1.Mybatis映射关系 1.1一对一映射之resultType 1.2resultMap处理映射关系 2.mybatis核心配置文件 1. properties&#xff08;属性&#xff09; 2. settings&#xff08;设置&#xff09; 3.typeAliases&#xff08;类型别名&#xff09; 4.environments&#xff0…...

Mybatis中limit用法与分页查询

错误示范 错误示范一&#xff1a; <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 失败 问题描述 如图&#xff0c;在做USB OTG 设备模式的时候需要用到libcomposite.ko驱动&#xff0c;加载失败了。 原因&解决方法 有一个依赖叫configfs.ko的驱动没有安装。可以从内核代码的fs/configfs/configfs.ko中找到这个驱动。先加载confi…...

Spring Tool Suite 4

参考&#xff1a;Spring tool suite4 安装及配置_springtoolsuite4_猿界零零七的博客-CSDN博客 下载&#xff1a;Spring | Tools 将下载的JAR进行解压两次&#xff0c;直至解压出contents中的sts 双击启动 第一次打开需要指定工作区文件夹 配置Maven的config 安装插件...

带你读论文第三期:微软研究员、北大博士陈琪,荣获NeurIPS杰出论文奖

Datawhale干货 来源&#xff1a;WhalePaper&#xff0c;负责人&#xff1a;芙蕖 WhalePaper简介 由Datawhale团队成员发起&#xff0c;对目前学术论文中比较成熟的 Topic 和开源方案进行分享&#xff0c;通过一起阅读、分享论文学习的方式帮助大家更好地“高效全面自律”学习&…...

农业中的计算机视觉 2023

物体检测应用于检测田间收割机和果园苹果 一、说明 欢迎来到Voxel51的计算机视觉行业聚焦博客系列的第一期。每个月&#xff0c;我们都将重点介绍不同行业&#xff08;从建筑到气候技术&#xff0c;从零售到机器人等&#xff09;如何使用计算机视觉、机器学习和人工智能来推动…...

掌握三个基础平面构成法则 优漫动游

1.图形重复&#xff1a;通过重复使用同一种或类似的图形元素,创造出一种有节奏、有重复感的视觉效果。这种设计手法可以使海报看起来更加统一和协调,增强视觉冲击力。 掌握三个基础平面构成法则 2.字体重复&#xff1a;通过重复使用同一种或类似的字体元素,创造出一种有序…...

叶工好容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&#xff08;长连接服务&#xff09; logic &#xff08;业务&#xff09; lsb &#xff08;负载均衡&#xff09;store&#xff08;存储&#xff09; - Gitee.com&#xff0c;需要指定某一…...

BCNet论文精读

Title—标题 Boundary Constraint Network&#xff08;边界约束网络&#xff09; With Cross Layer Feature Integration&#xff08;跨层特征融合&#xff09; for Polyp Segmentation&#xff08;息肉分割&#xff09; 结构分析 标题结构由三部分组成&#xff0c;分别是本文…...

PHP8的注释-PHP8知识详解

欢迎你来到PHP服务网&#xff0c;学习《PHP8知识详解》系列教程&#xff0c;本文学习的是《PHP8的注释》。 什么是注释&#xff1f; 注释是在程序代码中添加的文本&#xff0c;用于解释和说明代码的功能、逻辑或其他相关信息。注释通常不会被编译器或解释器处理&#xff0c;而…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...