3.1 函数默认参数
在C++中,函数的形参列表中的形参是可以有默认值的,函数参数的默认值就是说在声明函数或者定义函数的时候直接在参数后给赋值,这样在函数调用的时候调用时,函数调用者没有给有默认值的形参传值,它会默认使用它的默认值,反之,函数调用者给所有默认值的形参传值,则形参接受传递的值,不会使用默认值
语法格式:
返回值类型 函数名 (参数= 默认值){...}
示例:
#include<iostream>
using namespace std;
//函数默认值注意事项:
//1.当函数某个位置形参变量有默认值,默认参数定义的顺序为自右到左,即如果一个参数设定了默认值时,其右边的参数都要有默认值
//2.只有在无函数声明时,才可以在函数定义中设定形参默认值
int function1(int a = 10, int b = 10, int c = 10) {
return a + b + c;
}
//3.当函数声明中形参变量有默认值,函数定义的时候相同的形参变量就不能有默认值,否则出现形参多次重新赋值,编译器禁止声明和定义时同时定义相同形参默认值
int function2(int a, int b = 10,int c = 20);
int main() {
//4.默认参数调用时,则遵循参数调用顺序,自左到右逐个调用
cout << "调用时有指定参数,则不使用默认参数:" << function1(1,1,1) << endl;
cout << "调用时有缺少指定参数,则缺少指定参数使用默认参数: " << function1(20) << endl;//调用时只指定1个参数,按从左到右顺序调用,相当于function1(20,10,10);
cout << "调用时无指定参数,则全部使用默认参数: " << function1(20) << endl;//调用时指定0个参数,按从左到右顺序调用,相当于function1(10,10,10);
cout << "result = " << function2(20) << endl;
system("pause");
return 0;
}
//5.默认值可以是全局变量、全局常量,甚至是一个函数,但不可以是局部变量。因为默认参数的调用是在编译时确定的,而局部变量位置与默认值在编译时无法确定
int function2(int a,int b,int c) {
return a + b + c;
}
注意事项:
-
当函数某个位置形参变量有默认值,默认参数定义的顺序为自右到左,即如果一个参数设定了默认值时,其右边的参数都要有默认值,否则报错
-
只有在无函数声明时,才可以在函数定义中设定形参默认值
-
当函数声明中形参变量有默认值,函数实现的时候相同的形参变量就不能有默认参数,否则出现形参多次重新赋值,编译器禁止声明和定义时同时定义相同形参默认值
-
默认参数调用时,则遵循参数调用顺序,自左到右逐个调用
-
默认值可以是全局变量、全局常量,甚至是一个函数,但不可以是局部变量。因为默认参数的调用是在编译时确定的,而局部变量位置与默认值在编译时无法确定
-
当重载函数与默认参数共同使用时,要注意出现二义性问题。
3.2 函数占位参数
C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置
语法格式:
返回值类型 函数名 (数据类型){...}
在现阶段函数的占位参数存在意义不大,但是后面的学习中会用到该技术
示例:
#include<iostream>
using namespace std;
//定义一个占位函数function1,参数为一个形参和一个占位参数(无默认值)
void function1(int a,int) {
cout << "a的值为:" << a << endl;
}
///定义一个占位函数function2,参数为一个形参和一个占位参数(有默认值)
void function2(int a, int = 10) {
cout << "a的值为:" << a << endl;
}
int main() {
//调用函数function1时,当占位参数无默认值,传两个参数值且参数的数据类型要对应
//注意:调用函数时,函数的形参列表里有占位参数,且占位参数没有默认值时,必须填补该位置
function1(10,10);
//调用函数function2时,当占位参数有默认值,传一个参数值且参数的数据类型要对应
//注意:调用函数时,函数的形参列表里有占位参数,且占位参数有有默认值时,可以不用填补该位置
function2(10);
system("pause");
return 0;
}
注意事项:
- 当函数的形参列表里有占位参数,用来做占位,且占位参数无默认值,调用函数时必须填补该位置
- 当函数的形参列表里有占位参数,用来做占位,且占位参数有默认值,调用函数时可以不填补该位置
3.3 函数重载
3.3.1 函数重载概述
作用: 函数名可以相同,提高复用性
函数重载满足条件:
- 在同一个作用域下
- 函数名称相同
- 函数参数类型不同或者个数不同或者顺序不同
注意: 函数的返回值不可以作为函数重载的条件
示例:
#include<iostream>
using namespace std;
//函数重载的满足条件:
//1.函数都在同一个作用域下
//2.函数名称相同
//3.函数参数类型不同、参数个数不同以及参数类型顺序不同
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(10);
func(3.14);
func(10, 3.14);
func(3.14, 10);
system("pause");
return 0;
}
3.3.2 函数重载注意事项
- 引用作为重载条件
- 函数重载碰到函数默认参数
示例代码:
#include<iostream>
using namespace std;
//函数重载的注意事项
//1.引用作为重载的条件
//注意:函数中function的引用参数int& a ,是一个可读可写
void function(int& a) {
cout << "调用function(int& a)" << endl;
}
//注意:函数中function的引用参数const int& a,是一个只可读不可写
void function(const int& a) {
cout << "调用function(const int& a)" << endl;
}
//2.函数重载时存在默认值
void func(int a){
cout << "func(int a) 调用" << endl;
}
void func(int a, int b = 10){
cout << "func(int a, int b = 10) 调用" << endl;
}
int main() {
int a = 10;
//当调用function函数时,因为变量a也是一个可读可写的变量,所以会调用function(int& a)
function(a);
const int b = 20;
//当调用function函数时,因为变量b也是一个只可读不可写的变量,所以会调用function(const int& a)
function(b);
//当直接调用function(10)方式调用时,因为调用function(int& a)时,int& a = 10是不合法的,而调用function(const int& a)时,const int& a = 10合法,由于编译器自动转换int temp = 10; const int& ref = temp
function(10);
//注意:当重载函数与默认参数共同使用时,要注意出现二义性问题,编译器会报错
func(10,20);//正确,因为调用func函数时,明确的传入两个参数
func(10);//报错,因为调用func函数时,传入一个参数时,两个重载函数都可以被调用,导致发生二义性
system("pause");
return 0;
}
读万卷书,行万里路,博主会持续更新学习笔记,如有问题,可以留言和私信,我们一起进步!!!