函数重载和引用【C++】

文章目录

  • 函数重载
    • 什么是函数重载?
    • 函数重载的作用
    • 使用函数重载的注意点
    • 为什么C++可以函数重载,C语言不行?
  • 引用
    • 什么是引用?
    • 引用的语法
    • 引用的特点
    • 引用的使用场景
    • 引用的底层实现
    • 传参时传引用和传值的效率
    • 引用和指针的区别

函数重载

什么是函数重载?

函数重载:

重载函数是函数的一种特殊情况。
为方便使用,C++允许在同一作用域中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指1.参数的个数 2.类型 3.顺序)必须至少有一个不同
根据这些同名函数的参数表的不同,达成传入参数类型不同,调用的函数不同的效果


函数重载的作用

功能类似的函数可以用同一名字,不用费心思去取差别不大的名字


在这里插入图片描述
如果不用函数重载,就要给Swap,取Swap1,Swap2等名字容易混淆


使用函数重载的注意点

  • 函数重载与函数的返回值无关

  • 同名参数表不同参数表不同即参数类型不同或参数个数不同或参数顺序不同满足三个条件中的一个就行)】的函数就可以构成重载

参数类型不同:

在这里插入图片描述

参数个数不同:

在这里插入图片描述
参数顺序不同:
在这里插入图片描述

  • 只有同一作用域中的同名参数表不同函数才构成重载
    不同命名空间/类中的同名函数不可能构成重载

  • 重载函数也可以参数缺省

    在这里插入图片描述

这个时候就要注意:不要因为少传参数而导致调用的重载函数不明确

在这里插入图片描述


为什么C++可以函数重载,C语言不行?

这就又涉及到编译链接了,因为C++是在C语言的基础上出现的,而且C++是兼容C语言的【即C语言的语法在C++编译器中也能使用】所以C++的编译链接过程和C语言很像

不了解编译和链接的可以看我这篇文章:c语言编译和链接)

为什么C++可以函数重载,C语言不行?这一问题主要是在编译链接时的编译汇编时的符号汇总形成符号表【符号表:可以简单的将其视为 词法分析时拆分出来的所有特殊符号+该特殊符号对应的地址共同制作出的一份方便链接的表】的时候

C语言编译链接时函数名进入符号表时表中对应的特殊字符就是它的函数名【不做任何修饰】

而C++的函数进入符号表时表中对应的特殊字符是编译器根据该函数的参数表编译器自己的修饰规则每个编译器的修饰规则不同】对该函数名进行修饰之后的特殊符号,而不是单纯的函数名

上面的差异就在编译链接的链接部分起了不同的作用

因为链接是根据符号表中的特殊符号的名字找它的地址,并以此看它有没有定义
而C语言如果函数名同名了,那进入符号表的都是它的函数名根本区分不开,就算两个函数都有定义有地址,链接时编译器根本不知道找那个。

但C++不同它进入符号的是编译器根据该函数的参数表编译器自己的修饰规则修饰之后的符号,如果它的参数不同修饰后的符号就不同,链接时编译器“一眼“就看出不同了


引用

什么是引用?

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

即使用一个变量的引用就是使用该变量,修改它的引用也是修改变量自己


在这里插入图片描述


引用的语法

源变量的类型+&+别名=源变量名


在这里插入图片描述


引用的特点

  • 引用必须初始化

  • 一个变量可以有多个引用

    在这里插入图片描述

  • 引用一旦引用一个实体后就不能去引用其他实体了


如果直接=,就是赋值

在这里插入图片描述

在这里插入图片描述


引用的使用场景

引用可以做参数,可以达到类似指针的效果


在这里插入图片描述
这样设计Swap的参数的话,形参a,b就是实参a,c的引用,那么该a,b就是改a,c,改形参就是改实参


引用的底层实现

引用的底层【汇编层次】实现其实是和指针一样的

都是开出一个指针大小的空间将引用(指向)的变量的地址放进去

但是使用上却不同,为什么呢?

其实是编译器进行了隐式的包装,我们使用引用时使用到的就是那一层包装

所以一般认为:
引用语法上是不开空间的,引用和它引用的源变量共用一个空间

指针语法上是开空间的,将指向的对象的地址存入开出的空间


传参时传引用和传值的效率

传引用效率更高,因为引用底层实现是和指针一样的,开空间存地址

所以传参时,如果形参是引用,那么实参传递的其实是实参的地址


引用和指针的区别

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

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

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

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

  5. 没有NULL引用,但有NULL指针

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Word中插入Endnote参考文献时显示乱码

近期在写文章需要插入参考文献,使用Endnote插入时显示乱码,如下图所示: 文章末尾显示{ADDIN EN REFILIST } 解决方法 在网上找了诸多方法尝试也没有解决,最终找到一篇博客介绍了一种方法: word选项—高级&#xff1…

基于 Docker 的 python grpc quickstart

工作之后一直使用的 RPC 框架是 Apache 的 thrift,现在发现 grpc 更流行,所以也要学习一下,先来简单的跑一下 demo。在本地安装运行也很方便,不过因为有了 docker,所以在 docker 里面安装运行隔离性更好,顺…

OpenHarmony相机和媒体库-如何在ArkTS中调用相机拍照和录像。

介绍 此Demo展示如何在ArkTS中调用相机拍照和录像,以及如何使用媒体库接口进行媒体文件的增、删、改、查操作。 本示例用到了权限管理能力ohos.abilityAccessCtrl 相机模块能力接口ohos.multimedia.camera 图片处理接口ohos.multimedia.image 音视频相关媒体业…

基于Java+SpringBoot+Mybaties+layui+Vue+elememt 实习管理系统 的设计与实现

一.项目介绍 前台功能:用户进入系统可以实现首页,系统公告,个人中心,后台管理等功能进行操作 后台由管理员,实习单位,教师和学生,主要功能包括首页,个人中心,班级管理&am…

【nc工具信息传输】

nc,全名叫 netcat,它可以用来完成很多的网络功能,譬如端口扫描、建立TCP/UDP连接,数据传输、网络调试等等,因此,它也常被称为网络工具的 瑞士军刀 。 nc [-46DdhklnrStUuvzC] [-i interval] [-p source_po…

web组态

这是一款可以嵌入到任何项目组态插件,功能全面,可根据自己的项目需要进行二次开发,能大大的节省在组态上的开发时间,代码简单易懂。 I官网网站:www.hcy-soft.com |体验地址:http://www.byzt.net:60/sm/ 一、数据流向图及嵌入原…

渗透测试练习题解析 5(CTF web)

1、[安洵杯 2019]easy_serialize_php 1 考点:PHP 反序列化逃逸 变量覆盖 【代码审计】 通过 GET 的方式获取参数 f 的值,传递给变量 function 定义一个过滤函数,过滤掉特定字符(用空字符替换) 下面的代码其实没什么用…

回归(maskrcnn)

一、写在前面 虽然粉丝量很少 但是这是一个很好的平台 记录自己的历程 我看了一个很好的讲解视频 我记录一下操作过程4-maskrcnn源码修改方法哔哩哔哩bilibili 作者已经注销帐号了 但内容很好 二、maskrcnn介绍 Mask R-CNN(Mask Region-based Convolutional Neur…

【数据分析面试】10. 计算平均通勤时间(SQL:timestampdiff() 和datediff()区别)

题目 假设你在Uber工作。rides表包含了关于Uber用户在美国各地的行程信息。 编写一个查询,以获取纽约(NY)每位通勤者的平均通勤时间(以分钟为单位),以及纽约所有通勤者的平均通勤时间(以分钟为…

Spark实战:词频统计

文章目录 一、Spark实战:词频统计(一)Scala版1、分步完成词频统计2、一步搞定词频统计 (二)Python版1、分步完成词频统计2、一步搞定词频统计 二、实战总结 一、Spark实战:词频统计 (一&#x…

数据湖概述:大数据演进阶段-数据湖

文章目录 一. 大数据发展过程1. 离线大数据平台2. Lambda架构:速度层批层3. Kappa架构:流批一体4. 大数据架构痛点总结 二. 数据湖助力于解决数据仓库痛点问题1. 数据湖特点2. 开源数据湖的架构 三. 数据湖和数据仓库理念的对比1. 数据湖和数据仓库对比2…

兑换码生成算法

兑换码生成算法 兑换码生成算法1.兑换码的需求2.算法分析2.重兑校验算法3.防刷校验算法 3.算法实现 兑换码生成算法 兑换码生成通常涉及在特定场景下为用户提供特定产品或服务的权益或礼品,典型的应用场景包括优惠券、礼品卡、会员权益等。 1.兑换码的需求 要求如…

深入探索MySQL:成本模型解析与查询性能优化,及未来深度学习与AI模型的应用展望

码到三十五 : 个人主页 在数据库管理系统中,查询优化器是一个至关重要的组件,它负责将用户提交的SQL查询转换为高效的执行计划。在MySQL中,查询优化器使用了一个称为“成本模型”的机制来评估不同执行计划的优劣,并选择…

ChatGPT 之联盟营销

原文:ChatGPT for Affiliate Marketing 译者:飞龙 协议:CC BY-NC-SA 4.0 第二章 制定转化对话 制定转化对话是每个营销人员和企业所有者都应该掌握的关键技能。它涉及创建和传递引人入胜的信息,吸引您的受众并激励他们采取行动。…

OCR常用识别算法综述

参考:https://aistudio.baidu.com/education/lessonvideo/3279888 语种:常用字符36与常用汉字6623,区别。 标注:文本型位置/单字符位置,后者标注成本大 挑战:场景文字识别:字符大小、颜色、字体…

Rust---复合数据类型之结构体

目录 结构体的使用输出结果 结构体简化创建结构体更新语法元组结构体单元结构体(unit struct)结构体中的引用使用#[derive(Debug)]再次介绍 代码综合展示 与元组不同的是,结构体可以为内部的每个字段起一个富有含义的名称,因此无需…

【THM】Burp Suite:Other Modules(其他模块)-初级渗透测试

介绍 除了广泛认可的Repeater和Intruder房间之外,Burp Suite 还包含几个鲜为人知的模块。这些将成为这个房间探索的重点。 重点将放在解码器、比较器、排序器和组织器工具上。它们促进了编码文本的操作,支持数据集的比较,允许分析捕获的令牌内的随机性,并帮助您存储和注释…

吴恩达机器学习笔记:第 6 周-11机器学习系统的设计(Machine Learning System Design)11.1-11.5

目录 第 6 周 11、 机器学习系统的设计(Machine Learning System Design)11.1 首先要做什么11.2 误差分析11.3 类偏斜的误差度量11.4 查准率和查全率之间的权衡11.5 机器学习的数据 第 6 周 11、 机器学习系统的设计(Machine Learning System Design) 11.1 首先要做什么 在接…

复杂度的讲解

1.算法效率 如何衡量一个算法的好坏?从两个维度,时间和空间(算法运行的快慢,消耗的空间大不大)。因为计算机硬件领域的高速发展,如今计算机的存储量已经达到了一个很高的程度,所以现在我们一般…

Linux--进程(2)

目录 前言 1. 进程的状态 1.1 进程排队 1.2 运行,阻塞,挂起 2.Linux下具体的进程状态 2.1僵尸和孤儿 3.进程的优先级 4.Linux的调度与切换 前言 这篇继续来学习进程的其它知识 上篇文章:Linux--进程(1)-CS…