作者:几冬雪来
时间:2023年4月18日
内容:C++入门内容讲解
目录
前言:
1.函数重载:
2.引用:
3.缺省参数:
结尾:
前言:
在上一篇博客中我们正式的踏入了对C++板块的学习, 并且讲解了C++的一些基础知识,而今天我们将在原先的基础上进一步对我们的C++的内容进行进一步的说明。
1.函数重载:
在C++中有一个关键的操作被我们称为函数重载,那么函数重载是什么意思呢?就有个例子,如果现在我们要写代码来完成不同类型之间的相加该怎么写呢?
因为类型的不同,所以在这里我们就需要额外书写两个函数,一个来实现我们整形的相加,一个来实现浮点型的相加,因为C语言不允许同名函数的存在,相同会发生报错到不了链接的阶段。
而C++在这里引入了一个新的概念——函数重载,函数重载允许函数名相同,但是却又要求其参数不同。参数的不同包含着——参数的个数,类型和顺序不同。
从这里可以看出函数重载可以自动识别我们的类型,如果类型是整形的话,这里就调用我们的第一个函数,如果是浮点型的话就调用第二个函数,这里就是我们的类型不同。
下来函数我们的顺序不同和个数不同,我们就将他们的代码写一写。
这里分别是我们参数的个数不同和顺序不同的代码。这里有人就要问了,函数重载会不会使我们的运行速度下降呢?答案是不会的,因为类型匹配的操作是在我们编译的时候进行的,运行的时候直接走就行了,因此函数重载影响的是我们的编译速度并非运行速度。
既然我们的参数不同可以构成重载,那么我们的返回值不同是不是也能构成重载呢?答案是:不能。这是为什么呢?
其实在编译的时候,我们可以用到返回值,但是在调用的时候,我们只写入了参数,所以也就是说,在调用的时候我们并不看返回值是否不同因为无法区分,我们只看参数是否不同。它们在编译的时候就已经报错了,存在着函数调用歧义。(符号表在链接阶段生成)
这里我们也是对为什么C语言不允许函数名相同,而在我们的C++中可以允许我们函数名相同的原因,这里通过函数名修饰得出了这个结果。
那么这里我们要清楚的一个点是,如果我们有直接进行定义的话,就不需要再进行链接的操作,我们这里直接靠地址即可。
2.引用:
引用不是新定义的一个变量,而且给已存在的变量名一个别名,这也是我们C++填补了我们原本C语言指针模块的一个坑。
那么就有人要问了,我们的指针学习了这么久都没遇到什么问题,为什么会存在坑呢?
其实我们在链表板块就遇到了,也就是我们的函数调用的参数原本就是指针类型的,因为形参的改变不影响实参,所以在接收的时候我们就要使用到二级指针,这对于当时的我们来说可以说是一大噩梦。
这里我们的操作符是——&,同样的和运算符——<<一样是C语言和C++所可以通用的。接下来我们就来展示一下它的用法。
在这里我们画了一个图出来,这里我们可以看出来i和j虽然值都为0,但是它们却在两个不同的地址,而我们使用的引用操作符将i赋值给了k,这里就相当于我们的i和k指向了同一块地址。并且j进行++操作不会影响到i,k进行++操作会影响到i。
并且我们这里还有套娃行为。
在这里我们可以发现一个套娃的操作,也就是我们可以为别名k取一个新的别名,也可以为原本的值i再取一个新的别名,并且两个别名都可以进行使用。
那么在日常写代码的时候,我们在哪里会用到引用呢?这里我们举C语言中一个经典的题目,也就是交换两个数的值。
在这里我们可以看见,如果用C语言的写法,我们要改变两数的值要传它们的地址,并且接收的时候要用指针接收,在进行交换的时候还需要对其进行解引用的操作,十分的麻烦。而在C++中,我们直接传的a和b两个数的值,在函数调用中因为我们的引用使得我们的x和y分别指向了和a,b两个数的地址,因为传参的时候只需要传值,接收的时候用引用来接收,并且修改的时候不需要解引用,这就是日常引用在代码中被作用的地方。
同样的我们可以给整形定别名,也可以为指针定义别名。那么这里为指针定义别名要怎么做呢?
这里通过结果我们也看出我们的指针是成功的进行了交换,这也意味着我们可以为指针名别名来进行使用。
同样的我们也可以对结构体进行定别名。
以上就是我们两种对结构体进行定别名使用的方法,大家可以看一看。
3.缺省参数:
接下来我们来讲C++中一个重要的知识点——缺省参数,我们也叫它为默认参数。
我们先将代码写出来。
在这里,形参的话要接收的变成了一个函数而非类型值,当我们实参没有传东西的时候,这里我们调用函数打印的就是形参的值,如果实参有值的话,那就直接打印我们实参的值,这种方法被我们称为缺省参数。
当然我们的缺省参数也有许多可以用到的地方和规定所在。
首先我们的缺省参数分为以下两种:
左边的方法这种我们叫做的全缺省,而右边的这种方法因为a没有被缺省到,所以我们将其称之为半缺省。在这里我们的全缺省参数没有什么明确的规则去规定,但是我们的半缺省就有一些要注意的点了。
首先就是我们的半缺省参数不能出现,实参为空的情况,并且半缺省参数也无法实现空一个值在进行缺省的操作。另外要注意我们的缺省参数必须是要从左到右进行缺省的。
这里我们的缺省参数还可以运用在我们的结构体的开辟空间中,并且这里要注意的是,如果结构体有声明和定义同时存在的情况下,我们不能对二者都进行缺省,进行缺省的是我们的声明那一部分。
结尾:
到这里,我们的这一篇博客也是正式的结束了,在这一篇博客中我们又学习到了不少有用的知识,在下一篇博客中,我们将继续对C++的入门内容进行一个讲解,最后希望这篇博客能给大家带来帮助。