内容
1.函数默认参数
2.函数占位参数
3.函数重载使用和注意事项
——————————————————————————————————————————
*1.函数默认参数
C++中,函数形参列表中的形参可以有默认值。
语法:函数返回值类型 函数名(形参 = 默认值) {函数体}
#include<iostream>
using namespace std;
//函数默认参数
int func1(int a,int b=1,int c=2); //编译成功,未出错
int func1(int a,int b,int c){ //如果函数已经声明过形参的默认值了,那么在函数定义实现时就不能再有函数的默认值了
return a+b+c;
}
int func2(int a=1,int b=2,int c=3){
return a+b+c;
}
//int func2(int a = 1;int b,int c=3){ //编译器提示出错!
//return a+b+c;
//}
int main(){
func1(1,1,1);
cout<<func2()<<endl;
cout<<func1(1,1,1)<<endl;
system("pause");
return 0;
}
注意:
(1)函数形参列表中设置默认值时,如果出现了第一个参数设置了默认值,其之后的参数都必须设置默认值,不可出现中间未设的情况!
(2)函数声明已经设置了形参默认值了,在后面声明的时候就不能再设置形参默认了,否则生成会出错!
(3)如果函数定义时有三个参数,其中两个设置了默认值。函数调用时如果只传入一个实参,那么函数实现时使用第一个参数的实参值,后两个使用函数默认值。不会报错!
(4)如果函数定义时,每一个参数都设置了默认值,那么函数调用时不传入实参,也同样可以运行,因为函数实现时直接使用参数的默认值,同样不会报错!
*2.函数占位参数
C++中,函数的形参列表中可以有占位参数,用作占位设置参数个数,在函数调用时需要补全参数个数。
语法:返回值类型 函数名(参数类型1 形参名,参数类型2){函数体}
#include<iostream>
using namespace std;
//函数占位参数
void func3(int a,int){
//return a++;
cout<<"func3"<<endl;
}
int main(){
func3(1);//报错!显示传入参数太少
func3(1,1);
system("pause");
return 0;
}
注意:占位参数必须填补!在函数调用时必须需要补全参数个数。
*3.函数重载的使用及注意事项
作用:函数名可以相同,提高复用性
函数重载条件:
(1)函数名称相同
(2)函数作用域相同
(3)函数参数类型不同 or 参数个数不同 or 参数顺序不同
#include<iostream>
using namespace std;
//函数重载
void func(int a) {
cout << "函数func(int a)的调用" << endl;
}
void func(double a) { //函数重载,改变参数类型
cout << "函数func(double a)的调用" << endl;
}
void func(int a, int b) { //函数重载,改变参数个数
cout << "函数func(int a,int b)的调用" << endl;
}
void func(int a, double b) { //函数重载,改变参数个数/参数类型
cout << "函数func(int a,double b)的调用" << endl;
}
void func(double b, int a) { //函数重载,改变参数个数/改变参数顺序/改变参数类型
cout << "函数func(double b,int a)的调用" << endl;
}
//函数返回值不可以作为函数重载条件
//int func(double a, int b)
//{
// cout << "func (double a ,int b)的调用!" << endl;
//}
int main(){
func(1.0);
func(1, 1);
func(1, 1.0);
func(1.0, 1);
system("pause");
return 0;
}
注意:函数返回值不可以作为函数重载条件!
- 引用作为函数重载条件
- 函数重载与函数默认参数
#include<iostream>
using namespace std;
//引用作为函数重载条件、函数重载遇到函数默认参数
void func1(int& a) {
cout << "函数func1(& int a)的调用" << endl;
}
void func1(const int& a) {
cout << "函数func1(const & int a)的调用" << endl;
}
void func2(int a, int b = 1) {
cout << "函数func2(int a,int b = 1)的调用" << endl;
}
void func2(int a) {
cout << "函数func2(int a)的调用" << endl;
}
int main(){
int n = 1;
func1(n);
func1(1);
//func2(1);
//只传一个参数,发生歧义,既可以调用第一个func2函数(一个实参对应第一个形参,另一个使用定义的默认参数),也可以调用第二个func2函数(一个形参对应一个实参)
//func2(n); //只传一个参数,调用时发生歧义
system("pause");
return 0;
}
注意:当对函数进行重载时,要避免函数默认参数,在函数调用时发生歧义!