默认参数
这个也是C++新增的内容——当然python里面也有类似的功能
默认参数指的是:
当函数调用时,省略了实参时,自动使用形参中预设的值。
这也就是我们每次看到很多函数原型中里面的形参非常多,
但是我们实际使用的时候,
只需要传入几个关键实参就能实现功能的原因
这也为我们小白使用函数提供了方便
而这些默认参数也一般是用以辅助实现特殊功能的参数
一般对函数的正确执行没有太大影响
下面我们看一段实战代码
int change(int i,int j=1);
//注意这里只需要在原型中给出默认参数的值即可
int main()
{
int test1,test2;
int i = 10;
int j = 10;
test1 = change(i);
test2 = change(i,j);
cout << test1 << " " << test2;
return 0;
}
int change(int i,int j)
{
//该函数实现返回i*j
return i*j;
}
或者这样定义函数:
int change(int i,int j=1)
{
//该函数实现返回i*j
return i*j;
}//将函数之间写在main函数上面,这时就要包括默认参数的值
int main()
{
int test1,test2;
int i = 10;
int j = 10;
test1 = change(i);
test2 = change(i,j);
cout << test1 << " " << test2;
return 0;
}
输出结果:
10 100
函数重载
函数多态也是C++新增的功能(难怪大家都用C++这么多功能)
默认参数让我们能够使用不同数目的参数调用同一个函数,而函数多态,也就是函数重载,能让我们使用多个同名的函数
函数重载的关键是函数的参数列表——也就是函数的特征标
注意这里跟函数返回值的类型是没有关系的哦!
注意这里跟函数返回值的类型是没有关系的哦!
注意这里跟函数返回值的类型是没有关系的哦!
重要的事情说三遍!!!
还需要注意的几点
- 当我们使用重名函数的时候,编译器将根据所采用的用法使用有相应特征标的函数原型
- 当我们调用函数时,传入的参数与任何态的该函数都不匹配时,C++将会尝试使用标准类型转化强制进行匹配
- 编译器检查函数特征标时,将类型引用和类型本身视为同一个特征标
- 匹配函数时,不区分const和非const变量
下面来看个代码实例:
#include <iostream>
#include <stdio.h>
using namespace std;
void print(int x)
{
cout << x;
}
/*
如果函数定义成这样会报错,因为其实这个和上面这个函数重复了
不能算作函数重载
int print(int y)
{
printf("%d",y);
}*/
void print(char x)
{
cout << x;
}
void print(char x, int y)
{
printf("%c %d",x,y);
}
int main()
{
int x=100;
char y='a';
print(x);
printf("\n");
print(y);
printf("\n");
print(y,x);
return 0;
}
输出结果:
100
a
a 100
所以一定是看特征标!特征标!特征标!
什么时候该使用函数重载呢?
仅当函数基本执行相同的任务,但使用不同形式的数据时,我们可以使用函数重载,来使代码更加清晰
其实我们还有另一个大杀器同样可以解决这个问题——函数模板
函数模板
函数模板是通用的函数描述,使用通用类型来定义函数,其中的通用类型可用具体的类型替换。通过将类型作为参数传递给模板,可使编译器生成该类型的函数。
好处:还记得在写栈的压入,弹出时,当时用的C,涉及到不同类型的栈时,就得重复的写压入和弹出的函数(当时也没有函数重载),现在我们有函数模板,一键写好模板代入,真香!
下面来看看它的通用模板吧
template <class Any>
typename func(Any parameter1,Any parameter2...)
{
function...
}
首先第一行指出,要建立一个模板,将类型命名为Any,前面的关键词class是必须的(在新的版本中与typename等价),也就是说class Any 和typename Any都是可以编译通过的
当然我们使用函数模板的时候也可以用上函数重载来丰富函数的通用性
下面上一个实例代码吧!
#include <iostream>
#include <stdio.h>
using namespace std;
//这里写了一个通用的压栈和入栈的函数
//使用的是静态的数组栈
template <class Any> //函数原型声明
void push(Any x,Any a[]);
template <class Any>
void pop(Any x,Any a[]);
int top=0;
int a[10]; //两个不同类型的栈
char b[10];
int main()
{
int x;
char y;
cin >> x;
cin >> y;
push(x,a);//这里会自动识别变量类型
push(y,b);
pop(x,a);
pop(y,b);
return 0;
}
template <class Any> //注意每当要使用Any时,都要进行此声明!!!
void push(Any x,Any a[])
{
if(top>=10)
{
cout << "the stack is full!\n";
}
else
{
cout << x <<" has entered the stack!\n";
a[top]=x;
top++;
}
}
template <class Any>
void pop(Any x,Any a[])
{
if(top<=0)
cout << "the stack is empty!\n";
else
{
cout << x <<" was removed from the stack!\n";
a[top]=x;
top--;
}
}
输出结果:
100
a
100 has entered the stack!
a has entered the stack!
100 was removed from the stack!
a was removed from the stack!
这样就不用重复写执行内容几乎相同的函数啦!
C++果然好用!!!
您的点赞是我创作的最大动力!