Hi!我是Duoni!
目录
缺省参数
全缺省参数
半缺省参数
杂谈浅解
函数重载
函数重载实现原则
缺省参数是指:当调用处函数传参为空时,函数体部分则使用函数声明处的缺省值执行函数运算。
void Def_num(int val = 1)//缺省参数
{
std::cout << val << std::endl;
}
int main()
{
Def_num(5);
Def_num(2);
Def_num();//此时不传参数,便会使用缺省参数
return 0;
}
tips:缺省参数的逻辑可以很明了的理解为“补漏”。更生活化的理解就是车辆的“备胎”,不到关键时刻绝不会使用。
全缺省参数是指:函数声明处参数都定义有缺省值。
tips:若函数调用处传参不全,不满足函数声明处的参数个数。那么,函数定义处将由左到右接收参数,缺少的则使用缺省值。
传参规则:由左向右(函数定义处参数接收顺序),不可跳跃。
缺省值定义规则: 必须将所有参数都定义缺省值。
附:具体情形以下演示。
void Def_num(int val_1 = 33, int val_2 = 66, int val_3 = 99)//都定义缺省值
{
std::cout << "val_1 = " << val_1 << std::endl;
std::cout << "val_2 = " << val_2 << std::endl;
std::cout << "val_3 = " << val_3 << std::endl;
std::cout << std::endl;
}
int main()
{
Def_num(5);//5传给val_1,少参数位使用缺省值,语法正确
Def_num(5,6);//从左向右规则,缺参数使用缺省值,语法正确
Def_num(5,6,7);//同理,语法正确
//Def_num(,6,7);//语法错误,不得跨越传参
//Def_num(5,,7);//语法错误,不得跨越传参
return 0;
}
半缺省参数是指:函数声明参数进行部分缺省值定义,遵守缺省值定义规则。
传参规则:从左向右(接收参数),不得跨越传参(传参处)。
缺省值定义规则:缺省值定义必须从右向左定义,必须连续缺省,不得跨越。
//void Def_num(int val_1 = 33, int val_2, int val_3)//从左向右定义缺省值,违反语法
//void Def_num(int val_1 = 33, int val_2, int val_3 = 99)//跨越定义缺省值,语法错误
void Def_num(int val_1, int val_2 = 66, int val_3 = 99)
{
std::cout << "val_1 = " << val_1 << std::endl;
std::cout << "val_2 = " << val_2 << std::endl;
std::cout << "val_3 = " << val_3 << std::endl;
std::cout << std::endl;
}
int main()
{
Def_num(5,6,7);
Def_num(5,6);
Def_num(5);
//Def_num(5, , 7);语法错误,跨越传参
//Def_num(,6,7);同理
return 0;
}
tips:若是运行任意一个错误项,就会有以下警报。
附:缺省参数不能在函数声明与定义中同时出现。为何?
此类情况多发在项目中,将函数声明与函数定义分开的模式,接下来进行模拟。
void Simul_num(int val_1, int val_2 = 5);//函数声明
void Simul_num(int val_1, int val_2 = 10)//函数定义
{
std::cout << val_1 + val_2 << std::endl;
}
函数声明和函数定义同时定义缺省值会引发很多不必要的麻烦。
如代码处:在函数声明中val_2缺省值被定义为:5,函数定义中val_2缺省值也被定义为:10。
如此多变,函数该使用谁的缺省值呢?
答案是:谁都不会使用。
或许会有人质疑,如果缺省值都定成一样的数值,会不会有所改变呢?
其实,对于函数调用来说,它会更以函数声明作为权威的参考值,但函数定义也有一定的影响性。所以一旦出现两方重复定义就会产生分歧,最后造成参数的重定义!
小结:在进行缺省值定义时,要在函数声明中定义。(声明定义不分离,在类中定义成内联函数)
tips:缺省参数定义最好使用常量。
函数重载是指:可以定义多个函数名相同的函数体,通过函数参数列表中形参的区分,而达到调用同一函数名,就可实现不同的函数定义。
函数重载的意义:减少函数的命名复杂性,减少命名污染,方便使用。
void Defau_Fun(int tege, double doub)//重载函数1
{
std::cout << "重载函数一:" << tege + doub << std::endl;
}
void Defau_Fun(double doub, int tege)//重载函数2
{
std::cout << "重载函数二:" << tege + doub << std::endl;
}
int main()
{
Defau_Fun(3, 2.21);
Defau_Fun(2.1, 50);
return 0;
}
小结:初步来看,函数重载的作用在于能够调用同一函数名而实现不同的函数功能,弥补了C语言函数名不能相同的困扰,而其核心在于C++对函数名的识别规则,参数列表是此功能得以实现的重器。
以下展开详谈。
1、同名函数的声明必须所属在同一个作用域。
tips:都在全局或局部(正确),定义在不同命名空间或类中(错误)。
2、函数形参列表要做到:参数个数不同、类型不同、顺序不同。
若出现两个或多个参数列表相同函数,则重载函数都不调用,发生歧义。
例:
(1)、个数不同
void Defau_Fun(int tege)//个数不同
{
std::cout << tege << std::endl;
}
void Defau_Fun(double tege, double fafb)//个数不同
{
std::cout << tege + fafb << std::endl;
}
(2)、类型不同
void Defau_Fun(int tege, int fafb)//类型不同
{
std::cout << tege + fafb << std::endl;
}
void Defau_Fun(double tege, double fafb)//类型不同
{
std::cout << tege + fafb << std::endl;
}
(3)、顺序不同
void Defau_Fun(int tege, double fafb)//顺序不同
{
std::cout << tege + fafb << std::endl;
}
void Defau_Fun(double fafb, int tege)//顺序不同
{
std::cout << tege + fafb << std::endl;
}
tips:若参数符合重载规则,但函数返回值不同,也无法构成重载,原因是函数无法进行区分。
小结:最核心的使用思想就是注意区分参数,通过传参调控,进入你所想使用的函数中。
附:重载函数的应用范围十分广泛,就好比上文提到的:输入/输出的自动类型识别。
文章到这就结束啦!如果喜欢就关注Duoni叭!