C++ 函数进阶

cout << endl;

}

int main()
{
F(100,200);
F(100, 200, 300);

return 0;

}


![](https://img-blog.csdnimg.cn/direct/e994791fbe134c589c9a9aab5f8d7a95.png)


注意:


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



//错误示例
void F(int a=10, int b, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
cout << endl;
}


**2. 缺省参数不能在函数声明和定义中同时出现;**



//错误示例
//test.cpp中定义

F(int a = 10);

//test.h中声明

F(int a = 20);
//编译器会报错


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


**4. C语言不支持(编译器不支持);**



### 缺省参数应用


在之前数据结构的学习中,我们经常用到某个函数给来实现对某种数据结构的初始化(以栈为例);



struct Stack
{
int* a;
int top;
int capacity;
};

void StackInit(struct Stack* ps)
{
int capacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
ps->a = (int*)malloc(sizeof(int) * capacity);

if (ps->a == NULL)
{
	perror("malloc fail");
	return;
}

//...

}


这样的写法有一个缺点,不管我们需要多大的空间,每次调用初始化函数时第一次都只能开辟4的空间,看着很呆板。


但是运用缺省参数改进后:



void StackInit(struct Stack* ps, int defaultcapacity=4)
{

ps->a = (int*)malloc(sizeof(int) * defaultcapacity);

if (ps->a == NULL)
{
	perror("malloc fail");
	return;
}

//...

}


当我们想指定开辟多大空间时只需要多传一个参数就可以了,否则默认为4。


当然除了这样的使用场景,缺省参数可以运用于很多很多场景,使得代码灵活性更高!




## 占位参数


C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置


**语法:** `返回值类型 函数名 (数据类型){}`



//函数占位参数 ,占位参数也可以有默认参数
void func(int a, int) {
cout << “this is func” << endl;
}

int main() {

func(10,10); //占位参数必须填补

system("pause");

return 0;

}





## 函数重载


**作用:**函数名可以相同,提高复用性


**函数重载满足条件:**


* 同一个作用域下
* 函数名称相同
* 函数参数**类型不同** 或者 **个数不同** 或者 **顺序不同**


**注意:** 函数的返回值不可以作为函数重载的条件


**示例:**



//函数重载需要函数都在同一个作用域下
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;

}



### 函数重载注意事项


* 引用作为重载条件
* 函数重载碰到函数默认参数



//函数重载注意事项
//1、引用作为重载条件

void func(int &a)
{
cout << "func (int &a) 调用 " << endl;
}

void func(const int &a)
{
cout << "func (const int &a) 调用 " << endl;
}

//2、函数重载碰到函数默认参数

void func2(int a, int b = 10)
{
cout << “func2(int a, int b = 10) 调用” << endl;
}

void func2(int a)
{
cout << “func2(int a) 调用” << endl;
}

int main() {

int a = 10;
func(a); //调用无const
func(10);//调用有const


//func2(10); //碰到默认参数产生歧义,需要避免

system("pause");

return 0;

}




### C++支持函数重载的原理


我们用函数重载定义函数Add,在我们眼中,两个函数名字相同,参数不同,调用函数时,我们知道应该调用哪个,那么编译器在链接阶段,如何知道去哪寻找对应的函数栈帧呢?



int Add(int a, int b)
{
return a + b;
}

double Add(double a, double b)
{
return a + b;
}

int main()
{
Add(10, 20);

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

1️⃣零基础入门
① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

image

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值