【C++·峰顶计划】缺省参数操作与函数重载细则

Hi!我是Duoni!

5cdaa5a944e74302a51ba699ec932941.jpeg


目录

🍉缺省参数

🍉全缺省参数

🍉半缺省参数

🍉杂谈浅解

🍉函数重载

🍉函数重载实现原则


🍉缺省参数

缺省参数是指:当调用处函数传参为空时,函数体部分则使用函数声明处的缺省值执行函数运算。

void Def_num(int val = 1)//缺省参数
{
       std::cout << val << std::endl;
}

int main()
{
       Def_num(5);
       Def_num(2);
       Def_num();//此时不传参数,便会使用缺省参数
       return 0;
}

5552ccbd8d7c4507a3c706ac52f7d8b7.png

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;
}

b8975ea25d85419496123dad5747c411.png


🍉半缺省参数

半缺省参数是指:函数声明参数进行部分缺省值定义,遵守缺省值定义规则。

传参规则:从左向右(接收参数),不得跨越传参(传参处)。

缺省值定义规则:缺省值定义必须从右向左定义,必须连续缺省,不得跨越。

//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;
}

61ee578c7e704d719052b191df4dc1b0.png

tips:若是运行任意一个错误项,就会有以下警报。

43cfab8161414db49c58e4b2d2a63afb.png


🍉杂谈浅解

附:缺省参数不能在函数声明与定义中同时出现。为何?

此类情况多发在项目中,将函数声明与函数定义分开的模式,接下来进行模拟。

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。

如此多变,函数该使用谁的缺省值呢?

答案是:谁都不会使用。

或许会有人质疑,如果缺省值都定成一样的数值,会不会有所改变呢?

其实,对于函数调用来说,它会更以函数声明作为权威的参考值,但函数定义也有一定的影响性。所以一旦出现两方重复定义就会产生分歧,最后造成参数的重定义!

df91e7a6de35452b8768de55eaa53b87.png

小结:在进行缺省值定义时,要在函数声明中定义。(声明定义不分离,在类中定义成内联函数)

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;
}

aa12c233a82144daa5dfdff4d5b2aca3.png

小结:初步来看,函数重载的作用在于能够调用同一函数名而实现不同的函数功能,弥补了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叭!

  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值