目录
前言
缺省参数就是给函数设置默认值,缺省参数只能在c++中使用,在C语言编译器里会报错。
函数重载是指在相同的作用域中通过相同的函数名但不同的参数类型或不同的参数个数来实现不同的功能。
引用可以理解为给变量取别名。
缺省参数
在C语言中我们编写一个函数来实现某种功能时,是不会往函数定义那块写入具体的数据的,如果写入了那就回报错。
但是c++可以这么写,这就是缺省参数,缺省参数可以是一个也可以是多个,如果全部都有默认值,那就是全缺省参数,否则就是半缺省参数。
顺便一提,c++对函数的返回值要求更加严格,若不是void类型的函数,则必须要设置返回值。
注意①:半缺省参数有一定要求:一旦某个参数给了默认值,那么在他后面的参数都得带上默认值,不能间隔着给默认值。
例如:
void func(int a, int b=1, int c=2) //没问题
void func(int a=0, int b, int c=2) //报错
注意②:在函数的申明和定义中只给其中一个设置缺省参数,不能两个都设置。
建议给函数申明设置缺省参数,因为如果我们要写开源的代码,那么会提供给别人第三方库、头文件,而头文件中 包含了声明,必须保证声明的正确性。
函数重载
在相同的作用域中通过相同函数名的不同函数类型或不同的参数个数,来实现函数的不同功能(但与函数返回值类型无关)
在我们写代码过程中可能会用到很多相似功能的函数,比如交换函数,但是因为需要交换的数据类型不同,所以需要很多个不同的函数来实现:
以上 全是交换函数,但因为数据类型不同所以不能实现统一(在C语言中)。但在c++中有函数重载概念:
int add(int a, int b){
return a + b;
}
float add(float a, float b){
return a + b;
}
char add(char a, char b){
return a + b;
}
这样函数名字就不用做区分了,只需要函数的参数类型或参数个数不同就行,但注意:这不与函数返回值相关(只是返回值类型不同无法形成重载)
但是如果函数名都相同那么编译器怎么区分?
其实编译器在编译代码时会对传递的实参类型进行推演,根据结果选择合适的函数。
如果输入的数据是int类型那么编译器会自动识别然后选择对应的函数,但如果像下面代码里面第三个add(1,2.2),1是int型,2.2是double型,而上面没有add(int a,double b)时会报错,编译器无法识别该用哪个函数。
注意:函数之间一定要在同一个作用域才能形成重载
引用
在C语言中如果我们要交换两个变量的值,那么只能传地址给函数,不能传值,而在c++中我们不需要传地址也可以做到真正的交换,这就是引用。
int a = 1, b = 2;
int& ra = a; //ra是a的引用
int& rb = b; //rb是b的引用
引用ra、rb就是a、b的别名,也就相当于是他们自己本身,别名就是个外号。所以传递他们的引用就是传递他们自己本身。
void Swap(int& a,int& b){//传递a和b的引用
int tem = a;
a = b;
b = tem;
}
int main(){
int a = 1, b = 2;
int& ra = a; //ra是a的引用
int& rb = b; //rb是b的引用
Swap(ra,rb);
cout << a << " " << b << endl;
}
可以看到a和b已经完成交换了。
常引用
const类的引用:
const int a=100;
int& ra=a; //报错,因为a是常量
const int a=100;
const int& ra=a; //没问题