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

C++入门二-重载和引用

文章目录

  • 重载
  • 引用
  • 思维导图

重载

概念:在同一作用域内,函数参数列表不同 : 参数的个数 或 参数的顺序 或 参数的类型

代码演示:
在这里插入图片描述
在这里插入图片描述
那么,为什么C语言没有函数重载呢?

这就得从编译链接的角度分析了。先来回顾一下编译和连接都干了什么。

预处理:头文件的包含/条件编译指令/宏展开等等… − > t e s t . i -> test.i >test.i
编译:检查语法,是否匹配。 − > t e s t s -> tests >tests
汇编:把汇编代码编译为机器指令。 − > t e s t . o -> test.o >test.o
链接:各自生成的 .o 文件链接在一起。

例如我们现在有这么一个工程:
在这里插入图片描述
我们都知道函数名其实就是个地址,但它的地址其实是第一条指令的地址,如下图,在这里插入图片描述
而我们 t e s t . c p p test.cpp test.cpp 中只有一个函数的声明,相当于只有那个 c a l l call call 的地址,其实是没有函数的地址的。当我们把 函数的定义干掉的时候。
在这里插入图片描述
其实文件编译是还可以编译的过的。这个声明就相当于你知道了这里会有定义一样。所以才可以编过。
举个例子:

你现在想买一套房子,距离叫首付还差5万块钱,那么这时候你去找你的好哥们打了个电话,说:哥们,最近我打算买房子,但首付还差五万块钱,你能不能借我五万块钱?
你哥们说:没逝没逝,五万块钱没有问题。
那么这个时候,你心里有了个底,直接把定金就叫了。

那么此时我们运行一下?
在这里插入图片描述
可以看到此时我们虽然有了声明,但是缺少定义。这个问题就出在了链接上,我们找不到 Add() 对应的定义。这就相当于该交首付了,你哥们却说钱没了。
在这里插入图片描述
此时我们加上,成功运行。

回到问题上:那么,为什么C语言没有函数重载呢?

对于在一个工程里面(声明和定义不在同一个文件中)

那么链接的时候,我们就要那我们的函数名去对应的文件中 . o .o .o 文件的函数表去查找

  • C语言查找的时候直接拿函数名去查找的。
  • C++拿修饰过的函数名去查找的

先来看一下vs的修饰:
在这里插入图片描述
如上图:

在C++中, ? f @ @ Y A X H D @ Z ?f@@YAXHD@Z ?f@@YAXHD@Z
这里的 H H H 代表 i n t int int D D D代表的是 c h a r char char,这也是为什么C++支持函数重组,而C语言直接拿函数名去查找,比如上图的 A d d Add Add 。至于修饰规则是由编译器决定的。

引用

概念:就是给变量取个别名,而且共用同一片空间。

int x = 0;
int& p = x // 这里的 int& p = x,就相当于给 x 取个别名。
p = 1; // 此时由于都指向都一个空间,x 也变为 1.

这里要注意: 别名必须初始化,就是你不能直接这样:

int& p;

在这里插入图片描述
此时 p 和 x 的地址是一样的。

在这里插入图片描述
如上图:在C语言中,我们需要两个指针,而C++只需要对参数引用即可,此时我们函数参数(形参)里面的 x 和 y x和y xy 就是 实参 x 和 y x和y xy

但是我们可以随便的取别名吗?
在这里插入图片描述

  • 如上图此时我们的 x 是不能修改的,而我们的p是可以修改的, 从不能修改 − > 可以修改 从不能修改->可以修改 从不能修改>可以修改 权力放大了,这是不行的。
    在这里插入图片描述
  • 如上图,此时 x 从可以修改 − > 不可以修改 x从可以修改->不可以修改 x从可以修改>不可以修改 权力缩小了,这是可以的。

思维导图

在这里插入图片描述

相关文章:

  • MybatisPlus 调用 原生SQL
  • 百度一下首页制作(HTML+CSS)
  • Java安全
  • 使用docker离线制作es镜像,方便内网环境部署
  • RabbitMQ实践——交换器(Exchange)和绑定(Banding)
  • 数据结构:快速排序,归并排序,计数排序的实现分析
  • DSP28335:定时器
  • Linux中ls -lsa 和ls -lst区别
  • leetcode189 轮转数组
  • 快速搭建Jenkins自动化集成cicd工具
  • 高效、智能、安全:小型机房EasyCVR+AI视频综合监控解决方案
  • 为数据安全护航,袋鼠云在数据分类分级上的探索实践
  • Spring Bean详解
  • 嵌入式实验---实验二 中断功能实验
  • 【计算机网络】[第4章 网络层][自用]
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 07.Android之多媒体问题
  • 0x05 Python数据分析,Anaconda八斩刀
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Babel配置的不完全指南
  • Gradle 5.0 正式版发布
  • HTTP那些事
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • REST架构的思考
  • supervisor 永不挂掉的进程 安装以及使用
  • 区块链共识机制优缺点对比都是什么
  • 什么软件可以剪辑音乐?
  • 使用docker-compose进行多节点部署
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 手机端车牌号码键盘的vue组件
  • 手写双向链表LinkedList的几个常用功能
  • 数组大概知多少
  • 如何正确理解,内页权重高于首页?
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #、%和$符号在OGNL表达式中经常出现
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (1)bark-ml
  • (1)STL算法之遍历容器
  • (3)nginx 配置(nginx.conf)
  • (30)数组元素和与数字和的绝对差
  • (4)事件处理——(7)简单事件(Simple events)
  • (C++17) std算法之执行策略 execution
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)Linux Shell编程——输入输出重定向
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (转) ns2/nam与nam实现相关的文件
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存