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️⃣零基础入门
① 学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!