函数重载
函数重载:是函数的一种特殊情况,C++允许形参列表(参数个数 或 类型 或 类型顺序)不同一作用域中声明几个功能类似的同名函数,这些同名函数常用来处理实现功能类似数据类型不同的问题。
最简单的理解就是同义词,同一个函数名称但是针对不同类型的数据。
下面举一个函数重载实例:
//_Add
int Add(int left, int right);//插入整型
{
return left + right;
}
//_Add
double Add(double left, double right);//插入浮点型
{
return left + right;
}
int Add(double left, int right);
{
return left + right;
}
int main()
{
Add(1.0, 2);//这样输入的话计算机会隐式转换不会报错也可以进行计算
Add(1, 2);//针对第二个
Add(1.0, 2.0);//针对第一个
return 0;
}
函数重载调用原理:
到底要调用那个重载的函数?编译器在编译阶段(四个阶段:预处理、编译、汇编和链接)已经确定好了。
在编译阶段,编译器会对传递的实参类型进行推演,根据推演的结果选择合适的重载函数进行调用
如果存在类型完全匹配的函数则直接调用如果类型不是完全匹配,则编译器会尝试发生隐式类型转换,如果转换之后有合适的重载函数,则调用;否则报错。
隐式类型转换:例如double类型1.2如果用int类型接收就会接收1但是字符串就不行“A”。
vs2019的情况下
为什么c语言不支持函数重载:首先C++作为高级语言在c的基础上做了一定的汇编c语言在接收的时候统一将函数add接收为_Add。
但是如果用C++的话接收到的是由区分的
结论:C++编译器对函数名字修饰规则:将参数类型信息添加到最终的名字中了虽然在代码层面函数名字是相同的,但是经过编译之后,最终的名字是不同,编译器才可以区分具体不同的方法。如果想在C++中调用C语言可以在函数前面加上extern “C”。
引用
用一个swap交换函数举例。
void swap(int left,int right)
{
int temp=left;
left=right;
right=temp;
}
int main()
{
swap(a,b);
return 0;
}
这里想用形参改变实参a,b的值肯定是不行的按照c语言会选择用指针的方式实现。如下,假设要换地址还得用二级指针。非常不方便。
void swap(int* left,int* right)
{
int temp=*left;
*left=*right;
*right=temp;
}
int main()
{
swap(a,b);
return 0;
}
在C++中用一种新的方法代替& 表示的是引用。
// 效果和目的:能够将传值和传地址的优点结合在一块
// 1. 可读性高
// 2. 安全性好
// 3. 传参效率高
// 4. 能够通过形参修改外部实参
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
int main()
{
swap(a,b);
return 0;
}
引用具体怎么用呢?
//在代码中
int main()
{
int a;
int& ra=a;
//这里这里ra 和a共用同一内存空间,同一个a可以有多个引用,但ra只能针对一个。
//引用类型必须和引用实体是同种类型的。
//引用可以简化代码,
struct A
{
int a;
int b;
};
struct B
{
int c;
A aa;
};
struct C
{
int d;
B bb;
};
int main()
{
C c;
c.d = 10;
// c.bb.aa.a = 20;
// c.bb.aa.b = 30;
// 利用引用简化代码
A& aa = c.bb.aa;
aa.a = 20;
aa.b = 30;
return 0;
}