目录
重载
参数的缺省
引用
引用总结:
重载
什么是函数的重载呢,在以前学C语言的时候都写过一个Max1的函数,目的就是求出两个数或者多个数的较大值,但它的参数很单一,只能接受一种参数,如果在已有int类型下还需要写一个double类型的Max函数就需要重新命令成Max2,但在c++中引入了函数重载的概念,也就是说,当我们在写一个参数为double类型的函数时同样可以用相同的函数名。但构成不是所有函数都可以构成重载,需要达到重载还需要满足几个条件
一:参数个数不能相同:
二:参数顺序不能相同
三:参数类型不能相同
接下来我们了解一下,编译器是如何找到我们需要的那个函数的呢。这里拿Linux的环境下做举例。我们知道在一个.cpp的文件转换成可执行文件需要经过编译,链接最后转换成可执行文件,在链接期间会有一个符号汇总,例如我们写了一个Max参数为int,int的函数,那么在Linux下就会转换成一个符号为
Z3(3表示函数名长度)Max(函数名)i(参数类型)i(参数类型)
如果参数为double的话同样就会生成一个Z3 Max dd的符号。
为什么说函数的重载不支持返回值不同呢,因为c++可以忽略返回值,因此不知道调用的是哪个函数。
参数的缺省
什么是参数的缺省,比如我们在写一个函数的时候但是没有写参数。
这里我们可以看到当我们不传某个参数的时候也可以在形参类写上我们需要的值。这就是全缺省参数,同样也有半缺省参数,但是值得注意的是半缺省参数需要从右往左边缺省,如果右边有没有缺省就不可以直接缺省左边。
引用
说起来引用和指针的共功能很相似,但是引用实际上就是一个变量的别名,例如水浒传里面的李逵,我叫黑旋风也是他,铁牛也是他,这里我可以通过地址来看一看。
这里我们也确实可以看到 变量a,b,c,d的地址都是一样的,也证明了b,c,d确实是变量a的别名。
但是指针是这个变量的地址,并且引用时不开空间的。
这里我们可以看到引用和指针实现的功能是一样的,但是指针在使用的时候会有各种解引用,可能还有造成空指针的问题,使用起来很不方便,所以我们的祖师爷当时在使用的时候也觉得这样地址传来传去的很麻烦,索性就把这个变量起一个别名,用别名来实现它。
至于为什么说别名使用起来更高效我们这里可以简单看一下。当我写一个ADD函数的时候,最后返回这两个数的和的时候,编译器不是直接把值返回去,而是会生成一个临时变量
而引用不会生成临时变量。
但是这里值得注意的是,在引用作为参数返回的时候,因为不会生成临时变量 ,所以返回值需要是在堆区或者静态区,因为在函数结束的时候会销毁栈帧,里面的变量同样也会被销毁,所以下次访问到这个值的时候是不确定测。
在引用的过程中,权限是不可以被放大的,但是权限可以平移或者缩小。这里我们举个例子。
权限的扩大
权限的缩小
权限的平移
还要注意一点,引用在sizeof中为引用类型的大小,但是指针无论什么类型在32为平台下都是4字节64为下都是8字节
引用总结:
1:引用概念上定义一个变量的别名,指针存储变量地址
2:引用定义时必须初始化,指针没有要求
3:没有NULL引用,有NULL指针
4:引用一个实体后就不能在引用其他实体,但指针可以改变指向
5:在sizeof中引用为类型大小,指针在32为下为4字节,64为下为8字节
6:引用自增+1及实体+1,指针+1实际向后便宜1个类型大小
7:有多级指针但没有多级引用
8:访问实体不同,指针需要解引用,引用是由编译器自己处理
9:引用相对于指针更安全