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 。至于修饰规则是由编译器决定的。

引用

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

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

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

cpp 复制代码
int& p;

此时 p 和 x 的地址是一样的。

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

但是我们可以随便的取别名吗?

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

思维导图

相关推荐
落羽的落羽10 分钟前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
总要学点什么1 小时前
第108篇:三维特效-图片轨迹线效果——把贴图滚成一串箭头,想用它的本色反而整条消失
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
starzy19905 小时前
深入理解Scala隐式值:编译期自动装配
开发语言·后端·scala
布莱克6056 小时前
Swift 条件语句详解:从 if 到 switch 的完整指南
开发语言·ssh·swift·switch·条件语句·guard·if
汉克老师6 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
吴可可1236 小时前
ActiveX调用WScript.Shell原理揭秘
开发语言
晴天的雨.9927 小时前
【C++】继承篇
java·开发语言·c++
SomeOtherTime7 小时前
第 1 讲:内存布局与所有权解剖——栈帧、胖指针与“移动/拷贝”在汇编层面的真实面目
java·开发语言·汇编
青少儿编程课堂7 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven7 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造