下面我们说一下缺省参数,那么什么是缺省参数呢?就是说在定义或者声明函数时给形参赋予一个确定的值(也叫缺省值),那么当我们调用这个函数的时候,就可以不传值也可以传值,传值的话缺省值就没作用了,不传值的话就按缺省值去参与函数的运行,下面是一个简单的例子
#include<iostream>
using namespace std;
void Func(int a = 10, int b = 20) {
cout << a + b << endl;
}
int main() {
Func();//30
Func(1, 2);//3
return 0;
}
这就是一个简单的例子,我们在调用函数时既可以传值也可以不传值,函数的处理方式是不一样的
缺省函数可以分为全缺省和半缺省,顾名思义,全缺省就是形式参数全都有缺省值,我在调用函数的时候可以完全不传实参,就像上面的例子中的第一个调用一样;半缺省就是形参部分有缺省值,但谁有缺省值也是有规则的,规则是给缺省值要从右往左连续给,这也是为了减少传参时候的争议。在传参的时候就要给没缺省值的参数传参。就比如下面这样
#include<iostream>
using namespace std;
void Func(int a , int b = 20) {
cout << a + b << endl;
}
int main() {
Func(1);//21
return 0;
}
另外还要提的一个点就是如果一个函数的声明和定义分离时,缺省值只能在声明给,不能在定义给
#include<iostream>
using namespace std;
void Func(int a=10, int b=20);
int main() {
Func();
return 0;
}
void Func(int a, int b ) {
cout << a + b << endl;
}
下面说一下函数重载,我们知道,在C语言中是不支持函数重名的,这就导致我们在完成一些任务时很烦,所以呢,C++就引入了函数重载这个概念,意思就是允许函数重名的存在,但是它们的参数一定是不同的,这里的不同可以包括参数数量,参数类型等等,对于返回值没有要求,下面也是举一个函数重载的例子
#include<iostream>
using namespace std;
void Add(int a, int b) {
cout << a + b << endl;
}
void Add(double a, double b) {
cout << a + b << endl;
}
int main() {
Add(1, 2);//3
Add(1.1, 2.2);//3.3
return 0;
}
在执行函数时,编译器会匹配参数的类型从而选到合适的函数,第一个就会默认调用第一个函数,因为它们的参数类型是匹配的,第二个同理。
不知道大家有没有想过,为什么C++支持函数重载呢?或者说本质上C++是通过什么去实现的呢?
我们知道,C语言或C++从我们写的代码到形成可执行程序是要经历几个步骤的,有预处理,编译,汇编(转换成二进制的机器码)和链接几个过程,在编译阶段,只要编译器能找到一个函数的声明就能通过,它不需要知道函数的地址(所以当我们在只写函数声明不写定义的时候,编译器报的是链接错误),
而是在链接这个阶段才需要知道函数的地址,那么怎么找到这个地址呢?C语言就是通过函数名,而C++还得加上函数的参数才能找到,在windows下也可以看见
下面是分别在C和C++下的报错情况
上面的C就只跟函数名有关系,下面的C++的中间的那群“乱码”就是C++下的对于函数名的修饰,在Linux环境下是这样的:_Z 函数名字符个数 函数名 参数首字母