目录
一、函数的默认值
语法:返回值类型 函数名(参数类型 无默认值的参数名,参数类型 有默认值的参数 = 默认值)
#include <iostream>
using namespace std;
int sum(int a, int b = 10, int c = 20);//声明中进行函数默认值设定,也可以在定义子进行设定
int main() {
cout << "仅给无默认值的参数传入值:" << endl;
int a = 10;
cout << "a + b + c = " << sum(a) << endl; //当函数的参数具有默认值时,函数调用时可以选择只传递无默认值的参数,其它参数使用默认值
cout << "给部分有默认值的参数传入值:" << endl;
int b = 20;
cout << "a + b + c = " << sum(a, b) << endl;//当函数的参数具有默认值时,函数调用时也可以选择给部分有默认值的参数重新传入参数
system("pause");
return 0;
}
int sum(int a, int b, int c) { //声明中已经设置参数默认值,在定义中不能在进行默认值设定
return a+b+c;
}
仅给无默认值的参数传入值:
a + b + c = 40
给部分有默认值的参数传入值:
a + b + c = 50
请按任意键继续. . .
注:
- 函数具有默认值的参数必须全部位于参数列表的最右侧(结尾),而无默认值的参数必须在全部有默认值的参数的左侧;
- 有默认值的函数在函数声明和函数定义时只能有一个地方有默认值,否则可能出现二义性。
二、函数的占位参数
C++函数的形参列表中可以有占位参数,用来做占位,函数调用时必须填补该位置。
语法:返回值类型 函数名(非占位参数数据类型 非占位参数名,占位参数数据类型)
即使用参数类型进行占位。
注:占位参数可以有默认值,此时函数调用时可以不给占位参数传值。
#include <iostream>
using namespace std;
void test01(int a, int) { // 最后int用做占位参数
cout << "This is a function." << endl;
}
void test02(int a, int = 10) { // 最后int用做占位参数,且给占位参数赋默认值
cout << "This is a function." << endl;
}
int main() {
int a = 10;
test01(a, 10); //函数调用时必须给占位参数传值
test02(a); //当占位参数有默认值时,可以不给占位参数传值
system("pause");
return 0;
}
三、函数重载
1. 函数重载的条件
函数重载可以使同一个名称的函数实现不同功能,提高复用性。
函数重载的条件:
- 同一个作用域下
- 函数名相同
- 函数参数类型不同或参数数量不同或参数顺序不同
注:函数的返回值不可以作为函数重载的条件
#include <iostream>
using namespace std;
//函数的初始定义
void func() {
cout << "调用func()" << endl;
}
//函数参数数量不同情况下的重载
void func(int a) {
cout << "调用func(int a)" << endl;
}
//函数参数类型不同情况下的重载
void func(double a) {
cout << "调用func(double a)" << endl;
}
//函数参数个数不同情况下的重载
void func(int a, double b) {
cout << "调用func(int a, double b)" << endl;
}
//函数参数顺序不同情况下的重载
void func(double a, int b) {
cout << "调用func(double a, int b)" << endl;
}
//返回值不同不可以作为函数重载的条件,以下为错误案例
//int func(double a, int b) {
// cout << "调用func(double a, int b)" << endl;
//}
int main() {
func();
func(2);
func(2.1);
func(2, 2.1);
func(2.1, 2);
system("pause");
return 0;
}
调用func()
调用func(int a)
调用func(double a)
调用func(int a, double b)
调用func(double a, int b)
请按任意键继续. . .
2. 函数重载的注意事项
- 当引用作为函数参数是可以是函数重载的条件,为参数类型不同。
#include <iostream>
using namespace std;
//定义使用引用做参数的函数
void func(int &a) {
cout << "调用func(int &a)" << endl;
}
//使用const修饰的引用做参数进行函数重载
void func(const int &a) {
cout << "调用func(const int &a)" << endl;
}
int main() {
int a = 10;
func(a);
func(10); // 当10传入void func(int &a)函数时,有表达式 int &a = 10 非法,因此调用void func(const int &a)函数
system("pause");
return 0;
}
调用func(int &a)
调用func(const int &a)
请按任意键继续. . .
- 函数重载碰到有默认参数时,容易出现二义性,尽量避免在函数重载中使用默认参数
#include <iostream>
using namespace std;
// 定义有默认参数的函数
void func(int a, int b = 10) {
cout << "调用func(int a, int b = 10)" << endl;
}
//对具有默认参数的函数进行重载(参数数量不同)
void func(int a) {
cout << "调用func(int a)" << endl;
}
int main() {
func(10, 20); //当给默认参数传入值时,编译器能够区分我们调用的是 func(int a, int b = 10)
//func(10); // 当不给默认参数传值时,编译器无法区分我们调用的是哪个函数,出现二义性
system("pause");
return 0;
}