承接上篇,我们在上一篇博客中提及过,我们c++入门还有一些。这一篇博客会着重写重载和引用。当然还会有一些其他的知识点。但是大家主要是需要了解这两个重点。好,那么我们马上来讲讲今天的主题。
引用
引用的含义
好我们还是先看含义引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。大家看这个应该很好理解的吧。就是可以简单理解为取外号。我们都知道取外号嘛。又不是换了个名字就变成了另外一个人了嘛。意思好理解。那么就实践使用一下。
引用的用法
首先咧,引用的基本模式是这个样子的:类型& 引⽤别名 = 引⽤对象;这个还是比较形象的吧。只是大家可以会觉得比较混乱就是这个&。在c语言中不是取地址的意思嘛。你这个c++这里突然改变了一下。一时间还不好反应过来咧。这里咧就涉及到了我们下一个要将的知识点“重载”。那么因为后面要讲。这里就不说那么多了。
引用的特性
与其说说是引用的特性我觉得更加确切的说成引用的规定。我们知道世界都是在一条条规定下井然有序的。如果没有规矩的约束那么世界的秩序就乱了。那么引用的特性有那行咧。具体有三个:• 引⽤在定义时必须初始化
上面我们写了特性中的两个。一个就是我们引用必须初始化 。具体啥意思咧。就是我们引用的时候我们的引用值可以不初始化,只要能满足后续的要求都无所谓。但是我,类型& 引⽤别名 = 引⽤对象中的引用对象不能没有。如果没有的话就会报错。第二个一个变量可以多个引用。这里就是我们图片中y与b都是引用的我们的a。这里我们只是取了两个“外号”嘛。但是如果后面需要还可以依据自己的需要再取。第三个引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体。这也好理解啊。大家可以简答理解为如果你没结婚你可以有很多个女朋友。但是当你结婚了以后,你就只能一心一意的对你的伴偶好。这个解释通俗易懂吧。
引用的使用
好了,理论基础打好了,那么接下来我们就用代码来具体使用一下。但在使用前我们想想引用大概率会用在什么地方法咧。不可能每次使用都像我们上面的那个样子简简单单的使用吧。肯定有些大佬会想出更改有用的玩法。那么一般引用会用在哪些方面咧:引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被引⽤对象。这样讲还是比较抽象的那么我们具体举几个例子,比如引用改变原值,引用做参数,引用做返回值等。我们接下来也主要以这三个方面来举例子:改变原来的值很简单,上面的图片其实就已经是这样的了。
大家看上面的图片,我们原本的a值为10,但是经过b=c后,a的值就改变了。我们也可以清楚的看到我们并没用直接改变a的值,而是改变了a的引用。这就表明了我们前面讲的的引用只是取了个“外号”。东西还是那个东西只是多久一个名字而已。
引用做参数:写法还是很简单的,其实也可以和c语言中的那个传参。然后子函数的参数名字无所谓的。大家可以融会贯通一下。区别是c语言中形参不能改变实参。但是c++中的引用可以改变实参。个人觉得确实要比C语言中的要好用一些:
我们可以看到a的值再一次的改变了。由10->20->30。那么我们康康a的“外号”有哪些了。b,y,h。现在a除了叫a以外还有三个名字。这里大家应该知道引用做参数的使用方法了吧。
引用做返回值 :对于返回值也是很简单的。其实大家如果不看我这里的解释的话,自己思考一下。引用除了基本的那个用法,大家都可以猜的七七八八的。对于引用做返回值的话我们直接来看看:
返回值嘛。就是我们需要返回的是是引用而已。但是咧我们不能只是在子函数里面引用一下就可以了。我们还要在参数的时候也要引用,不然的话,子函数的参数就只会是一个形参,而不是引用了。因为我们说过c++包含c'语言嘛。那么不满足c++那么系统会自动认为是c语言的。
补充:引用并不是简单的只能用在子函数里面指针也是可以的。因为c++包容c语言所以有些时候大家可以会看到下面的代码。那时正常的,以前觉得奇怪的因为我们还没学引用,但是当我们学习了这部分知识后,可不敢再不认识了:
重载
重载的含义
关于重载的含义我们先看看比较官方的解释是什么样子的:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。这个解释我觉得还是比较有用的,因为我们可以看到解释中写道有几个功能类似的同名函数。最主要的是什么,同名啊。我们想想我们在c语言的时候,有时候写过代码还要想想这个名字可以不,会不会冲突啊。是吧,但是c++就不一样了。那么具体是个什么不一样。接下里我们就看看。
重载的不同
而说重载重要吧,主要是后面对我们的使用很有帮助,毕竟重载我们还使用了c++中的自动区分参数类型的。那么c++中如果名字相同系统和我们如何区分我们使用的是哪个代码咧:
参数类型的不同 :大家看到了吧。上面的图片我们是名字一样的。区别是什么,我们代码所接收的参数不一样。当然还有朋友说。你这里数据类型不也不一样嘛。一个是int一个的double。是我们这里看确实能一眼看出来这个区别。但是我们在使用的时候我们能看出来嘛。我们使用的时候看不见源代码,我们能知道这个数据类型不一样嘛。所以这里大家只需要知道可以依据参数的类型不同可以区分我们使用的是哪个代码。
参数的个数不同 :接下来的这个就更加简单了。依据参数的个数不同。我们想想如果有两个重载函数,然后一个参数需要1个另外一个不需要参数。那么我们使用的时候传了一个参数,那么你会选哪个函数。是吧。这个应该是很好理解的。
参数的顺序不同:我们都可以猜到,要是想区分是哪个函数,只能在开头下功夫,那么我们。除了上面的两种区分还剩什么咧。当然是我们的小标题,看参数的顺序了。是不是也很简单啊。我们在传递过来的时候,系统判断我们的参数顺序,然后区分是哪个函数:
注:区分重载函数只能在开头区分,返回值不能区分也就是我们前面第一个例子中的int与double。不能作为区分依据。还有就是我们在参数个数不同的时候。假如一个参数都没有,那么我们在主函数的时候就要写()。不然的话系统是会报错的。因为你不写()的话,系统哪知道你是想表达没有参数还是有参数但是忘了写咧,就像下面的样子:
const
接下来我们介绍的是我们相当于日常中的限制词。当我们用这个const限制应该对象后。我们的这个对象就只能读不能改变。也就是说当被const修饰后,该对象就只能看不能动了。虽然大家在前期的使用比较少。但是我们的祖师爷设计出来肯定有它存在的意义。毕竟存在即合理嘛。那么接下里就是使用方法了:
如果只是讲const的基本使用方法的话感觉有点挫,所以我们来看特殊案例。 然后大家就是需要注意的就是。只要被const修饰过后,就不能改变,类型也不能改变,就只能读。希望大家主页。
内联函数
什么是内联函数列:⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就需要建⽴栈帧了,就可以提⾼效率。但是我们在vs的debug版本下⾯默认是不展开inline的,这样⽅便调试,debug版本想展开需要设置⼀下以下两个地⽅:
大家依据上面的操作就可以打开 inline了。但是对于inline有一个很好玩的地方就是,我们就算是写了inline但是编译器如果觉得你这个不好的话,是不会展开的。就是展不展开看编译器心情。
然后就是这个大家了解一下吧。因为这个可能会用到一点单片机的编程知识。我对这些是一点都不知道的,所以我也没办法给大家讲太多,所以大家在我这了解有这么一个指令就可以了。
nullptr
nullptr 看样子大家就知道有点像我们c语言中的null。并且NULL实际是⼀个宏,在传统的C头⽂件(stddef.h)中,但是在C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换 成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型。那这个如何解释咧。我们来看看下面的图片:
大家可以看一下上面的图片,就是这个nullptr的大概使用方法了。
总结
大家对这篇博客主要是了解引用。因为这个确实是很好用。对我们后面的学习与使用也是很有帮助的。后面的知识点也有用。但是大家不必太着急因为我们这里才入门咧。后面还早,所以我们现在以了解为主,不用强逼自己完全熟知它的使用方法。
补充:大家如过对鄙人的实验代码感兴趣的话可以在gitee上面收搜@yang-hong-and-duan。因为这里用的是实验代码,所以我就不发出来了。