C++缺省参数与函数重载

1.缺省参数

1.1定义

即函数声明或定义时为函数指定一个缺省值,如果调用函数时传入参数,则变量的值为实参的值,如果调用时未传入参数,则变量的值为缺省值。

//其中a = 0即为定义的缺省值
void Fun_test(int a = 0)
{
	cout << "a= " << a << endl;
}

int main()
{
    //传入参数,a为实参值,输出a = 1
	Fun_test(1);
    //未传入参数,a为缺省值,输出a = 0
	Fun_test();
	return 0;
}

1.2缺省参数分类

即函数的参数传入了缺省值,调用函数时如果想要使用缺省值,必须保证从右往左连续使用。

1.2.1全缺省参数

即函数的所有参数传入了缺省值,调用函数时如果想要使用缺省值,必须保证从右往左连续使用。

void Func_test(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}

int main()
{
	//使用缺省值,必须从右往左连续使用,即本利按c b a顺序缺省
    //输出1 2 3,即未使用缺省值
	Func_test(1, 2, 3);
    //输出1 2 30,c变量使用了缺省值
	Func_test(1, 2);
    //输出1 20 30,b c变量使用了缺省值
	Func_test(1);
    //输出10 20 30,a b c变量均使用了缺省值
	Func_test();
}

1.2.2半确实参数(部分缺省)

即函数的部分参数传入了缺省值,且缺省值必须从右往左连续缺省,调用函数时如果想要使用缺省值,必须保证从右往左连续使用。

void Func_test(int a, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}

int main()
{
	//使用缺省值,必须从右往左连续使用,即本利按c b a顺序缺省
    //输出1 2 3,即未使用缺省值
	Func_test(1, 2, 3);
    //输出1 2 30,c变量使用了缺省值
	Func_test(1, 2);
    //输出1 20 30,b c变量使用了缺省值
	Func_test(1);
}

1.3总结

注意:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给

  2. 缺省参数不能在函数声明和定义中同时出现,当在main函数中调用Func时会报错。(因为这种情况下,如果两个缺省值给不同值,编译器不知道该调用哪个),同时出现时建议在声明时给缺省参数,定义时不给。

//a.h文件中的函数声明
void Func(int a = 20);
  
// a.cpp文件中的函数定义
void Func(int a = 20)
{}


//下面这种情况下,编译器就分不清到底该使用哪个缺省值,所以不支持声明与定义都用缺省值
//a.h1文件中的函数声明
void Func(int a = 10);
  
// a.cpp1文件中的函数定义
void Func(int a = 20)
{}

//同时出现时建议在声明时给缺省参数,定义时不给。

       3.缺省值必须是常量或者全局变量

2.函数的重载

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数类型类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。即:有三种情况,看以下示例。

//1.参数类型不同,int 与 int
int Add(int left, int right)
{
	cout << "int(left + right)" << endl;
	return left + right;
}
//double 与 double
double Add(double left, double right)
{
	cout << "double(left + right) " << endl;
	return left + right;
}

//2.参数的个数不同,无参数
void fun()
{
	cout << "f" << endl;
}
//一个参数
void fun(int a)
{
	cout << "f(a)" << endl;
}
//两个参数
void fun(int a, int b)
{
	cout << "f(a,b)" << endl;
}

//3.参数的类型顺序不同,int 与 char
void fun(int a, char b)
{
	cout << "fun(int a, char b)" << endl;
}
//char 与 int
void fun(char a, int b)
{
	cout << "fun(char a, int b)" << endl;
}

2.1C++支持函数重载原理

C++在编译过程中,按照一定规则将函数名保留,还会保留参数的类型与顺序。

例如:

//可以简单理解为下面两种情况
// _Z3Addii-> _Z3:公共部分 Add:函数名 ii:参数类型 int int
int Add(int left, int right)
{
	cout << "int(left + right)" << endl;
	return left + right;
}
// _Z3Adddd-> _Z3:公共部分 Add:函数名 dd:参数类型 double double
double Add(double left, double right)
{
	cout << "double(left + right) " << endl;
	return left + right;
}

当然这只是方便理解,具体的规则根据编译器不同规则也不同,真正规则可能复杂的多,但是可以这样理解。

2.2总结

        1.函数重载有三种情况,参数类型不同参数个数不同参数类型顺序不同。

        2.返回值不同时不能构成函数重载。原因如下:

int Add(int left, int right)
{
	cout << "int(left + right)" << endl;
	return left + right;
}
double Add(int left, int right)
{
	cout << "double(left + right) " << endl;
	return left + right;
}
int main()
{
    //因为如果只有返回值不同,函数参数相同时,调用函数时,编译器无法区分调用的是哪个Add函数
    Add(1,2);
    Add(2,3);
}

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值