函数重载和引用

news2024/9/22 3:56:23

1.函数重载

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数 的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

C++支持函数重载,是因为C++编译器在编译阶段通过函数的参数类型、个数和顺序来决定调用哪个函数。

当我们定义多个函数名相同但参数类型、个数或顺序不同的函数时,C++编译器会根据实际调用时提供的参数信息来选择最匹配的函数进行调用。这个过程叫做重载决策。

具体的重载决策过程如下:

1. 编译器首先会查找与实际参数类型最为匹配的函数,如果找到一个完全匹配的函数,则直接调用该函数。

2. 如果没有找到完全匹配的函数,编译器会尝试进行隐式转换,将实际参数转换成形式参数类型,然后再次寻找最匹配的函数。

3. 如果有多个函数都能匹配,那么编译器会进行重载决策,选择最佳匹配的函数。这个过程会考虑函数参数的精确匹配、隐式转换的成本和二义性等因素。

需要注意的是,在进行函数重载时,函数的返回类型不会被考虑在内,只有参数类型、个数和顺序会影响函数重载的决策。

总之,C++的函数重载是通过编译器在编译阶段根据函数参数的类型、个数和顺序来决定调用哪个函数,以实现函数的重载功能。

简单来说就是C在找寻函数时使用其函数名去寻找的,如果函数名相同就找不到,而c++的中的名字和类型修饰规则可以区分每个函数,所以就可以调用不同函数。

#include <iostream>

// 函数重载示例
void print(int num) {
    std::cout << "Printing an integer: " << num << std::endl;
}

void print(double num) {
    std::cout << "Printing a double: " << num << std::endl;
}

void print(std::string str) {
    std::cout << "Printing a string: " << str << std::endl;
}

int main() {
    print(123); // 调用print(int)
    print(3.14); // 调用print(double)
    print("Hello, World!"); // 调用print(std::string)
    
    return 0;
}

上述是函数重载的例子。

那么无参函数和有参函数会构成重载吗?答案当然是会的。

在那种情况下调用的时候还是会报错呢?

这里初次俺的错误其实是调用歧义,因为这两个函数都不给参数都可以调用。

如果我们将缺省参数去掉会怎么样呢?

 

 这里看到就不会报错了,当我们将缺省参数去掉后,就需要传参了。

这种情况其实是Func函数重定义,就不是重载了,因为类型一样,个数一样,类型顺序一样。

2.引用 

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它 引用的变量共用同一块内存空间。

void TestRef()
{
 int a = 10;
 int& ra = a;//<====定义引用类型
 
 printf("%p\n", &a);
 printf("%p\n", &ra);
}

注意:引用类型必须和引用实体是同种类型的。

引用特点:

1. 引用在定义时必须初始化。

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

3. 引用一旦引用一个实体,再不能引用其他实体。

使用场景:

做参数:

void Swap(int& left, int& right)
{
 int temp = left;
 left = right;
 right = temp;
}

做返回值 :

int& Count()
{
 static int n = 0;
 n++;
 // ...
 return n;
}

我们来看一串代码:

int& Add(int a, int b)
{
 int c = a + b;
 return c;
}
int main()
{
 int& ret = Add(1, 2);
 Add(3, 4);
 cout << "Add(1, 2) is :"<< ret <<endl;
 return 0;
}

结果会是什么呢?

这里就设计一个问题,为何打印出来的是随机值呢?

其实是因为我们创建的临时变量c是局部变量,当调用Add函数后,就会将其申请的栈帧返回给操作系统,此时的别名ret也就是随机了。我们可以将int c改为静态就可以了。

 引用特点:

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是 传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是 当参数或者返回值类型非常大时,效率就更低。 

 引用和指针的区别:

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

引用和指针是C++中两种不同的概念,它们有以下区别:

1. 定义和初始化方式:指针变量使用 `*` 声明,需要通过取地址符 `&` 来获取变量的地址并初始化指针。而引用变量使用 `&` 声明,直接将变量名作为引用的别名。

2. 空值:指针可以为空,即指向空地址,表示不指向任何有效数据。引用必须在定义时初始化,并且不能为空。

3. 改变指向:指针可以在运行时改变指向,可以指向不同的对象或空地址。引用一旦初始化后就不能改变指向,始终引用同一个对象。

4. 使用方式:通过指针可以对对象进行操作,并且可以对指针进行解引用操作。引用作为对象的别名,和原始对象具有相同的行为。

5. 空间占用:指针需要占用额外的内存空间来存储地址值。而引用不需要额外的内存空间,因为它只是给原始对象起了一个别名。

6. 访问方式:通过指针可以改变指向对象的值,可以修改对象的内容。引用只是原始对象的别名,对引用的操作会直接作用于原始对象。

总的来说,指针提供了更灵活的操作和更多的控制能力,但也需要更加小心地处理空指针和指针的指向变化。而引用提供了更简洁的语法和更直观的代码,但对于指向不同对象的情况不适用。选择使用哪种方式取决于具体的需求和代码设计。

总结:

1. 引用概念上定义一个变量的别名,指针存储一个变量地址。

2. 引用在定义时必须初始化,指针没有要求。

3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型 实体。

4. 没有NULL引用,但有NULL指针。

5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占 4个字节)。

6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。

7. 有多级指针,但是没有多级引用。

8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理。

9. 引用比指针使用起来相对更安全。

谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1943212.html

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

相关文章

虚拟仿真如何实现多人在线使用?

在虚拟仿真教学或模型操作中&#xff0c;往往都是多人来对同一个模型来进行使用&#xff0c;但是这种情况下没办法更好的保证每个人都能参与进来&#xff0c;即使可以一起参与但是也没办法进行操作协作。我们可以尝试使用点量实时云渲染系统来解决实现多人同屏在线协同&#xf…

Vuex看这一篇就够了

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

埃文科技受邀出席2024年河南省工业领域网络和数据安全政策宣贯会

2024年7月18日&#xff0c;由河南省工业和信息化厅主办&#xff0c;河南省工业信息安全产业发展联盟、河南省信息安全产业协会承办的2024年河南省工业领域网络和数据安全政策宣贯会在郑州召开&#xff0c;活动旨在提升河南省工业领域网络和数据安全保护能力&#xff0c;助力企业…

2个案例区分是平行眼还是交叉眼,以及平行眼学习方法

案例一&#xff1a; 交叉眼&#xff1a;看到凸出的“灌水”&#xff0c;是交叉眼。PS&#xff1a;看的时候&#xff0c;眼是斗鸡眼&#xff0c;眼睛易疲劳 平行眼&#xff1a;看到凹陷的“灌水”&#xff0c;是平行眼。PS&#xff1a;看的时候眼睛是平视&#xff0c;不容易疲…

【BUG】已解决:Downgrade the protobuf package to 3.20.x or lower.

Downgrade the protobuf package to 3.20.x or lower. 目录 Downgrade the protobuf package to 3.20.x or lower. 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身…

微软蓝屏事件暴露的网络安全问题

目录 1.概述 2.软件更新流程中的风险管理和质量控制机制 2.1.测试流程 2.2.风险管理策略 2.3.质量控制措施 2.4.小结 3.预防类似大规模故障的最佳方案或应急响应对策 3.1. 设计冗余系统 3.2. 实施灾难恢复计划 3.3. 建立高可用架构 3.4. 类似规模的紧急故障下的响应…

别人电脑ping不通我的电脑,我可以ping通别人

1、打开开始菜单–控制面板   2、切换到大图标  3、找到防火墙    4、点击高级设置    5、查看入站规则   6、找到回显请求者2个&#xff08;IPV4&#xff09; 7、然后启用规则 再ping就可以了

优选算法之二分查找(下)

目录 一、山脉数组的峰顶索引 1.题目链接&#xff1a;852. 山脉数组的峰顶索引 2.题目描述&#xff1a; 3.解法一&#xff08;暴力查找&#xff09; &#x1f335;算法思路&#xff1a; &#x1f335;算法代码&#xff1a; 4.解法二&#xff08;二分查找&#xff09; &a…

【瑞芯微RV1126(板端摄像头图像数据采集)】②使用v4l2视频设备驱动框架采集图像数据

RV1126开发板&#xff1a;使用v4l2视频设备驱动框架采集图像数据 前言一、按键二、LCD显示三、V4L2 摄像头应用编程四、完整代码 前言 本系列的目的是&#xff0c;不仅仅将能够进行图片推理的模型部署于板端&#xff0c;还提供了两种摄像头数据采集的方法&#xff0c;集成到自…

Ubuntu 24 PXE Server bios+uefi 自动化部署esxi 6 7 8

pxe server 前言 PXE(Preboot eXecution Environment,预启动执行环境)是一种网络启动协议,允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器,它提供了启动镜像和引导加载程序,使得客户端计算机可以通过网络启动并安装操作系统或运行其他软件…

Java 集合框架:HashMap 的介绍、使用、原理与源码解析

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 020 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

【C++】再探构造函数 - 初始化列表详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

vue3 快速入门 (三) : vue中的图片路径

1. 本文环境 Vue版本 : 3.4.29Node.js版本 : v20.15.0系统 : Windows11 64位IDE : VsCode 2. 加载图片路径的方式 以下是VUE3中一些常见的引用图片路径的方法&#xff1a; 2.1 public文件夹的方式 2.1.1 public文件夹是什么 在 Vue3 中&#xff0c;public文件夹用于存放静…

绘制混淆矩阵热力图

Python绘制混淆矩阵热力图 用matplotlib绘制混淆矩阵&#xff0c;可以通过改变 imshow 函数中的 cmap 参数来修改颜色。cmap 参数接受一个 colormap 的名字&#xff0c;你可以选择许多不同的 colormap&#xff0c;例如 ‘viridis’, ‘plasma’, ‘inferno’, ‘magma’, ‘civ…

union的特性和大小端

一、union在c和c语言中的特性 1.共享内存空间&#xff1a;union的所有成员共享同一块内存空间。意味着在同一时刻&#xff0c;union 只能存储其成员 中的一个值。当你修改了union中的一个成员&#xff0c;那么其它成员的值也会被改变&#xff0c;因为它们实际上都是指向同一块…

Google Chrome 浏览器在链接上点右键的快捷键

如今&#xff0c;越来越多的软件都懒得设个快捷键&#xff0c;就算设置了连个下划线也懒得加了。 谷歌浏览器右键 > 链接另存为... 和 复制链接地址 的快捷键 (如图)

pycharm操作mysql数据库

1、创建测试数据库 use test;CREATE TABLE t_user ( id INT(11) NOT NULL AUTO_INCREMENT, userName VARCHAR(20) DEFAULT NULL, password VARCHAR(20) DEFAULT NULL, PRIMARY KEY (id)) ENGINEINNODB AUTO_INCREMENT2 DEFAULT CHARSETutf8;INSERT INTO t_user(id,userName,pas…

【HZHY-AI300G智能盒试用连载体验】在华为IoTDA平台上建立设备

目录 华为IoTDA平台 注册IoTDA实例 创建产品 添加设备 本文首发于&#xff1a;【HZHY-AI300G智能盒试用连载体验】 智能工业互联网网关 - 北京合众恒跃科技有限公司 - 电子技术论坛 - 广受欢迎的专业电子论坛! 在上一篇博文中介绍了如何在HZHY-AI300G智能盒创建南向设备&a…

【Linux 14】进程间通信概念

文章目录 &#x1f308; 一、进程间通信的目的&#x1f308; 二、进程间通信的理解&#x1f308; 三、进程间通信的分类 &#x1f308; 一、进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通…

过于复杂,复杂性越高,脆弱性也就越大。

现代计算架构的复杂性很容易让那些试图保护它们的网络安全从业者感到不知所措。 技术生产者和消费者必须做出彻底而根本的改变,以减轻当前和未来的网络威胁。 在过去 20 多年里,我们目睹了信息技术能力的爆炸式增长,渗透到了我们的个人和职业生活中。我们还看到,针对所有…