⭐本章主要介绍c++中的函数重载,重载的原理,和引用(参数引用,返回值引用)
⭐本人c++代码的Gitee仓库:c++学习 · 橘子真甜/yzc的c++学习 - 码云 - 开源中国 (gitee.com)
一.函数重载
1.1 什么是函数重载
函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数。这些函数的形参列表(参数个数,顺序,类型)不同。
举例:
//个数不同
int f1(int a)
{
return a;
}
int f1(int a, int b)
{
return a + b;
}
//类型不同
int f2(int a, int b)
{
return a + b;
}
int f2(double a, double b)
{
return a + b;
}
//顺序不同
int f2(int a, float b)
{
return a + b;
}
int f3(float a, int b)
{
return a + b;
}
当调用具有同名函数的函数时候,编译器会根据传入的参数去适配对应的函数。从而达到一种多态的效果。
举例:
#include<iostream>
using namespace std;
//类型不同
int f2(int a, int b)
{
return a + b;
}
double f2(double a, double b)
{
return a + b;
}
int main()
{
double x = f2(1.5, 2.5);
int y = f2(1, 2);
cout << "x:" << x << " y:" << y << endl;
return 0;
}
可以看出x的f2调用了 参数是double的f2,而y调用了参数是int的f2
1.2 C++支持函数重载的原理
为什么c++支持函数重载,而c语言不支持呢?
这是因为C++是通过函数修饰规则来区分,只要函数的参数不同,c++编译的时候就会根据参数的不同而修改函数的名称,这样就能够区分同命不同参的函数。
而C语言同名函数无法区分。
解释:
在linux下查看编译后函数的名称
这也解释了:函数名称和函数参数相同,返回值不同的函数无法构成重载。
因为它们的函数名称在修饰之后仍是一样的!
1.3 函数重载总结
函数重载:
1.函数名相同 2.参数不同 3.返回值没有要求
二.引用
引用是给已有变量取别名,不是新定义变量。引用变量和被引用的变量共用同一块内存空间。
例:
#include<iostream>
using namespace std;
int main()
{
int a = 123;
int& b = a;
cout << "a=" << a << " b=" << b << endl;
//输出a和b的地址进行观察
printf("a:%p\n", &a);
printf("b:%p\n", &b);
return 0;
}
这说明,b就是a。只不过取了另外一个名字。
2.1 引用的特性
1. 引用在定义的时候必须初始化。(要给出引用的对象)
不初始化会报错
2. 同一个变量可以有多个不同的引用。
3. 引用一旦引用一个实体,就不能再引用其他实体。
c=x,只是将x赋值给c。不是引用改变。
可以看出c=x之后,a的值也改变了
2.2 常引用
使用 const 关键字就能够使用常引用。
观察下面代码
可以看出,a1是a的常引用。而b1却报错了。这是为什么呢?
这是由于b是常量,而b1引用的时候确实普通变量。如果b1修改了,那么常量b也会修改。
这就不合理了。
所以:
引用取别名的时候不能够放大变量的访问权限,访问权限可以缩小,不能放大。
2.2 引用的使用场景
1. 作为函数的参数
void swap(int& a, int& b)
{
int t = a;
a = b;
b = t;
}
2. 作为函数的返回值
int& count()
{
static int n = 0;
n++;
return n;
}
注意:引用作为函数的返回值时候,不能返回函数里的局部变量!这么做是不安全的
举例:
#include<iostream>
using namespace std;
int& add(int x, int y)
{
int sum = x + y;
return sum;
}
int main()
{
int& a = add(1, 2);
add(3, 5);
cout << a;
return 0;
}
运行结果:
可以看出由于再次调用 add(3,5) ,导致a的值改变。
编译器也给出了warning,返回局部变量或者临时变量的地址
如果函数返回的时候,出了函数作用域,如果返回对象还在(没有被系统收回,如静态变量,全局变量),则可以使用引用返回。否则,不可使用引用返回。
2.3 传值,传引用效率比较
当传值返回,传值做参数的时候。函数不会直接传递实参,或者将变量直接返回,而是传入,或者返回变量的临时拷贝。所以使用传值当参数或者返回的时候,效率较低。
所以当我们可以使用引用返回或者做参数的时候,尽量使用引用,以提高效率。
2.4 引用,指针的区别
1.引用是变量的别名,共用同一块空间。 指针是变量的地址,通过地址进行修改变量
2.引用必须初始化。 指针没有要求
3.引用变量引用一个实体后,不能引用其他实体 指针可以指向其他变量的地址
4.没有NULL引用 有NULL指针
5.sizeof(引用) 的后果是被引用变量的大小 sizoef(指针)在32位下是4,64位下是8
6.引用++让原变量+1,指针++会指向原地址向后偏移一位的地址
7.有多级指针,没有多级引用
8.指针需要解引用才能访问变量, 引用编译器自动处理
9.引用相对指针更安全