一.函数的缺省参数
1.在前面的介绍中的我们了解到,C++这门语言是在C语言基础上改进和拓展的一门语言,C++兼容C,那么C中的函数在C++中同样适用。C++中的函数与C中的函数略有差异,我第一个介绍的就是缺省参数,下面我们来看两个代码段。
C语言函数:
C++函数:
大家先从函数的定义开始看,C语言中我们是不能给形参直接一个初值的,必须得传参数,不传参数无法使用参数,那么有些时候我们不太确定我们所需要传参的值的,那么在C++中,在定义函数时,可以给形参一个缺省值,缺省值的意思就是,即使缺省了这个参数,我函数也有一个值供我函数使用。我们看C++代码段,第一次调用并没有给函数传参,所以函数用的值就是定义时的缺省值,如果传参,那么传参实参会正常传给形参,不会影响函数的正常使用。缺省参数也有分类,分别是半缺省和全缺省,请注意:1. 半缺省参数必须从右往左依次来给出,不能间隔着给 2. 缺省参数不能在函数声明和定义中同时出现。
全缺省参数:
大家看,这就是一个全缺省参数,形参全部都有一个缺省值,传入一个参数会传给第一个形参。那么大家就可能有些疑问,这个传参,它能不能间隔着传参呢?比如不给a传参,只给b或c传参。
大家觉得这样可以吗?答案是不行的,大家写代码学习的时候一定要多往后想一步,或者想一想如果你是编译器,你能识别这样的指令吗,大家调用函数的时候,传参都是从左往右输入实参的吧,那么这里也是一样,并不能跳跃传参。只能先传第一个再传第二个,传完第一第二再传第三个。
半缺省参数:
注意:1. 半缺省参数必须从右往左依次来给出,不能间隔着给 2. 缺省参数不能在函数声明和定义中同时出现
二. 函数重载
1.自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重 载了。 比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个 是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”
2. 函数重载概念
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。
3.函数重载的由来
大家在C语言中自定义函数时,可能函数执行的操作类似,但由于形参类型的不同需要写成不同的函数名,在调用时十分的麻烦,还得加点后缀,所以C++中对于这方面就进行了改进,引入了函数重载,下面我们看一下代码段。大家可以看到,编译器会自动匹配传参类型而去匹配对应函数,不用使用不同的函数名,十分的方便。那为什么C++有函数重载而C语言没有呢?这样的原因是C++引入了函数名修饰规则,而C语言没有。简单可以理解为,在C++中,在连接时编译器会根据符号表找的函数地址是跟形参等等有关的,而C语言不是。下面我们来探讨一下当函数定义与声明分开时,函数调用的过程。
.h文件 .c文件
在函数定义和声明分离时,调用函数的大致过程:
下面是C语言时调用函数:
我们可以发现,在C语言中,调用函数时,是直接根据函数名在连接时去找函数,所以如果函数名相同,形参不同,则无法区分函数,不支持函数重载。下面我们看.cpp文件的运行。
C++运行:这里故意让他找不到函数,看看它调用函数的区别。
我们可以发现,在C++中,调用函数时,不光光是根据函数名去寻找函数,而是跟形参有关,这里我们可以把H看成形参int,D看成形参char,这样就能大致理解了C++调用函数时的情况。
三.引用(取别名)
1.在C语言中相信大家最不会的部分就是指针,所以在C++中就加入了引用(&)来一定程度上代替指针,下面我们先来介绍一下引用,也叫取别名。
大家可以看到,如果改变b的值,a也跟着改变,这里的b就叫a的别名。但是不能说a是b的别名,不能本末倒置。
注意:引用类型和引用实体必须是同类型的。
2.引用概念:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。
这里我们举个例子,比如说小明有个外号叫二蛋,小王是小明的好朋友,小红就问小王:“二蛋今天中午吃饭了吗?”,小王说“吃过了,在我家吃的。”,小红又问“那小明呢?”,小王就回话“你是不是有啥事啊,咋一个问题问两次呢?”小明和二蛋是同一个人,二蛋吃了饭那小明肯定也吃过了。
3.引用的权限
在我们生活中,上级给下级的权限只可能平行或者放小,不可能权限放大,这样底下的人就比上级的人权力还大,那就本末倒置了。
a为引用实体,相当于源,b是a的别名。下面我们来看指针取别名。
大家觉得可以这样给pa取别名吗?答案是不行的,const 在int*前代表着修饰pa指向的内容不可修改,
const 在int*后才是修饰指针本身。
那么这个pa代表着pa是不能修改a的值的,但是pA是可以修改a的值也可读的,所以说权限被放大。
4.引用的特性
1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体
大家再看下面的代码段这样的代码也是不行的,为什么呢,因为在计算运算符的时候,会创建一个临时变量来储存结果。这个临时变量再去执行赋值运算符,这个临时变量的属性是不可修改的,有const修饰,所以说这个代码也是权限的放大,临时变量只可读,sum可读可写,所以说报错。
在隐式类型转换或者强制类型转换也会产生临时变量,这个临时变量也具有常性,所以说取别名时得用const修饰。
5.引用和指针的区别
1.在前面的介绍中,我们发现指针和引用是类似的,我们直接来看他们俩的区别。
这里我们发现,在第底层上,其实引用和指针都开了一块空间来存a的地址,但在语法上b是a的别名,是跟a同一块空间,b就是a,语法上不开空间。平常我们探讨都是在语法层。
这次介绍到此为止,下次接着介绍内联函数(inline)等