13天带你了解C++ ---DAY2 函数重载&&引用
目录
一.函数重载
1.1什么是函数重载?
1.2重载函数如何使用呢?
1.2那么,若返回值不同,其他都相同,可以重载吗?
1.3为什么要引入重载呢?
1.4既然函数重载这么好用,为什么C语言不能使用呢?
二、c++中的引用
2.1什么是引用?
2.2引用如何使用呢?
2.3为什么会有引用呢?
2.3.1首先我们来了解一下参数传值和传地址。
2.3.2现在我们来看看传递引用
2.4常引用
2.4.1常引用的使用
一.函数重载
1.1什么是函数重载?
若多个函数具有相同的函数名,相同的作用域,不同的返回值,则这些函数就是进行了函数重载,此处的参数列表不同包括参数列表个数不同,次序不同,类型不同等
1.2重载函数如何使用呢?
#include using namespace std; void add(int a,int b){ int c=a+b; cout<<c<<endl; } void add(double a,double b){ double c=a+b; cout<<c<<endl; } void add(int a,int b,int c){ int d=a+b+c; cout<<d<<endl; } int main(){add(1,2); add(1.1,2.1); add(1,2,3); return 0; }
上边三个函数未重载函数,可以看到它们都是函数名相同,作用域相同,参数列表不同。
1.2那么,若返回值不同,其他都相同,可以重载吗?
答案是不可以,上栗子
#include using namespace std; int add(int a,int b){ int c=a+b; cout<<c<endl; return c; } void add(int a,int b){ int c=a+b; cout<<c<<endl; } int main(){add(1,2); add(1,2); return 0; }
此处编译器告诉我们只有返回值类型不同,不可以重载。
1.3为什么要引入重载呢?
C语言中是没有重载这个概念的,这个概念是随着面向对象一起引入C++的。面向对象的特性就是封装,多态和继承,函数重载很好的契合了多态的概念。在我们使用C语言编程时,如果我们想定义一个完美的add函数,我们只能改变函数名,比如int_add,double_add,定义太多之后我们自己往往也记不住,所以这就造成了很大的不方便。现在我们了解到函数重载后,这个问题就迎刃而解啦。
1.4既然函数重载这么好用,为什么C语言不能使用呢?
这个问题就要回到编译器上了,C语言在编译阶段会将我们的函数名重命名,具体操作就是在我们函数名之前加上“_”,调用时直接调用。这也就导致如果函数名相同,编译器就不能判断调用哪个函数,所以才会报错。 c++就在这个基础上进行了优化,在重命名这个阶段进行了优化,增加了参数列表的标识符,所以才可以函数重载。
其实c++也可以按照C语言的方式编译文件的,这时我们在函数之前加上entern "C"就可。
二、c++中的引用
2.1什么是引用?
引用是一种特殊类型的变量,也可以认为是另一个变量的别名,通过引用名访问和提高变量名访问效果是一样的。
2.2引用如何使用呢?
引用使用模板:类型& 变量名,比如int& ra=a;
#include using namespace std;int main(){ int a=0; int& ra=a;//ra就是a的引用 cout<<"a的值:"<<a<<endl; cout<<"ra的值"<<ra<<endl; cout<<"a的地址:"<<&a<<endl; cout<<"ra的地址:"<<&ra<<endl; return 0; }
上边程序演示了引用的使用方法,同时也验证了引用并不是变量内容的拷贝复制,而是变量的别名,因为它们的地址都是一样的。
2.3为什么会有引用呢?
众所周知,C语言是没有引用的,C语言想要操作变量一般都是使用指针的,指针的使用确实很方便,但是指针的缺点也是非常明显的,一不小心就会导致程序奔溃。相信大家当初都有被指针支配的恐惧吧,越界访问,访问空指针等等。引用的出现在极大程度上弱化了指针,我们从下边例子来看。
2.3.1首先我们来了解一下参数传值和传地址。
传值
#include using namespace std; void swap(int a,int b){ int c; c=a; a=b; b=c; } int main(){ int a=1,b=2; swap(a,b); cout<<a<<endl; cout<<b<<endl; return 0; }
结果:传值未完成交换
传地址
#include using namespace std; void swapp(int* a,int* b){ int c; c=*a; *a=*b; *b=c; } int main(){ int a=1,b=2; swapp(&a,&b); cout<<a<<endl; cout<<b<<endl; return 0; }
结果:完成交换
结论: 我们发现在C语言中我们想完成修改变量操作必须借助指针或者返回值赋值,直接传值是不能修改的
2.3.2现在我们来看看传递引用
#include using namespace std; void swapp(int& a,int& b){ int c; c=a; a=b; b=c; } int main(){ int a=1,b=2; int& aa=a; int& bb=b; swapp(aa,bb); cout<<a<<endl; cout<<b<<endl; return 0; }
现在我们知道了一种不用直接指针就可以操作变量的方法,那就是传递引用,这样就弱化了指针的使用,能降低出错的概率。
2.4常引用
2.4.1常引用的使用
常引用声明方式:const 类型& 引用名 =变量名;
#include using namespace std; int main(){int a=1;const int &ra=a;//ra=2; //编译不通过a=3; cout<<a<<endl; return 0; }
结果:能正常打印3,但是不能打印出2
结论:用const声明的引用,不能通过引用对变量进行修改,可以通过变量本身修改,这极大提升了引用的安全性
好啦,今天的内容到此为止啦,大家明天见哦!