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

函数重载和引用【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. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Unity类银河恶魔城学习记录12-7-2 p129 Craft UI - part 2源代码
  • git lfs如何使用
  • AI-漫画推文
  • 二维数组及其内存图解
  • 云手机提供私域流量变现方案
  • 如何在Java中创建对象输入流
  • WPF Pack
  • C# 字符串和枚举类型互相转换
  • 007 spring aop(通知)(xml)
  • fastlio2 保存每帧的点云和每帧的里程计为单独的文件做后端回环优化和手动回环优化
  • 整数和(推公式)
  • MongoDB复制集安装配置图文教程-Windows篇 fasstgpt必看
  • Rust---复合数据类型之字符串与切片(2)
  • LangChain - PromptTemplate
  • k8s删除namespace失败一直处于Terminating状态
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【剑指offer】让抽象问题具体化
  • css的样式优先级
  • docker容器内的网络抓包
  • ESLint简单操作
  • Hibernate最全面试题
  • HTML-表单
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript设计模式之工厂模式
  • java第三方包学习之lombok
  • jquery cookie
  • js递归,无限分级树形折叠菜单
  • Markdown 语法简单说明
  • MySQL-事务管理(基础)
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Vue UI框架库开发介绍
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 闭包--闭包之tab栏切换(四)
  • 编写高质量JavaScript代码之并发
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 警报:线上事故之CountDownLatch的威力
  • 盘点那些不知名却常用的 Git 操作
  • 思维导图—你不知道的JavaScript中卷
  • 推荐一个React的管理后台框架
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 选择阿里云数据库HBase版十大理由
  • ​【已解决】npm install​卡主不动的情况
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #php的pecl工具#
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $().each和$.each的区别
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (三)终结任务