缺省参数
即函数调用时实参个数可以与形参不相同
缺省参数指在定义时为形参指定缺省值(默认值) 这样在函数调用时,对于缺省参数可以给出实参值,也可以不给出 给出实参值,将实参传递给形参进行调用,如果不给出实参,按缺省值进行调用
缺省参数不一定是常量表达式,可以是任意表达式,甚至可以通过调用函数给出,表达式必须有意义
void delay(int loops = 5){
//延时函数,默认时延为5个时间单位
for(;loops>0;loops--);
}
int main(){
dalay(3);
cout<<"延时三个时间单位"<<endl;
dalay();//等同于dalay(5)
cout<<"时延五个时间单位"<<endl;
return 0;
}
void func(int a, int b = my_rand()) {//默认值什么都可以
cout << "a = " << a << "b = " << b << endl;
}
int main() {
func(1);
}
缺省参数可以有多个,但所有缺省参数必须放在参数表的右侧,即先定义所有非缺省参数,在定义缺省参数 这是因为在函数调用时,参数自左向右逐个匹配,当实参和形参个数不一致时只有这样才不会产生二义性
void func(int a = 0, int b = 4, int c = 3, int d = 2, int e = 1) {
printf("a = %d,b = %d,c = %d,d = %d,e = %d\n", a, b, c, d, e);
}
//给默认值从右到左给 不能跳过
int main() {
int x = 10;
cin >> x;
func(12,23);
//实参从左到右给 不能跳过 没有给实参的采用func中的默认值 给实参的用实参
func(12, (23, 34, 45, 56));
//逗号表达式 采取最后一位56作为b的传递值 其余采取实参或默认值
return 0;
}
缺省参数不一定必须是常变量,可以使用任意表达式
void func(int a, int* p = (int*)malloc(sizeof(int))) {
cout << a << endl;
free(p);
}
int main() {
func(1);
}
函数重载
函数原型:int(类别) + MAX(函数名) + 参数列表
c++是根据函数原型进行区分的 c是根据函数名进行区分的 所以c++可以进行函数的重载
函数重载解析步骤: 1.确定函数调用考虑的重载函数几何,确定函数调用中实参表属性 2.从重载函数集合中选择函数,该函数可以在(给出实参个数和类型)的情况下可以调用函数 3.选择与调用最匹配的函数
//int H
//"?MAX@@YAHHH@Z" —— 新的函数名(名字粉碎技术)
int MAX(int a, int b) { return a > b ? a : b; }
//char D
//"?MAX@@YADDD@Z"
char MAX(char a, char b) { return a > b ? a : b; }
//double N
//"?MAX@@YANNN@Z"
double MAX(double a, double b) { return a > b ? a : b; }
int main() {
cout << MAX(12, 23) << endl;
cout << MAX('a', 'x') << endl;
cout << MAX(12.23, 34.45) << endl;
}
//返回类型上不同 不能重载 计算机无法确定你所想进行的是哪个函数
int MAX(char a, char b){ return a > b ? a : b; }
char MAX(char a, char b) { return a > b ? a : b; }
如果两个函数的参数表相同,但返回值不同,会被标记为编译错误,函数重复声明
不可以重载的运算符: :: sizeof() ? : *.