C++函数重载

函数参数默认值

在C++中,函数的参数可以设置默认值。例如:

void function(int a=1,int b=2,int c=3){
    cout<< a <<" "<< b <<" "<< c <<endl;
}

让我们在主函数中测试一下,函数参数默认值怎么使用:

int main()
{
    fun();//1 2 3
    fun(11);//11 2 3
    fun(11,22);//11 22 3
    fun(11,22,33);//11 22 33
    return 0;
}

 显而易见,当没有传入实参时,形参会使用默认值进行初始化。但当传入参数时,该参数相当于重新赋值,初始化的默认值被新值覆盖,也就不会使用默认值。但不能说我想让a和c使用我的值,b使用默认值,这是不可以的。C++中,函数参数默认值必须是参数列表从右向左依次赋予默认值,不可跳过任何一个去间隔设置默认值。

函数参数默认值:
    1.如果当前位置有参数默认值,那么后面的参数必须也有参数默认值
    (参数列表从右向左依次赋予缺省值/默认值)

    2.在函数声明时有参数默认值,函数定义时不能有参数默认值

对于第二点的情况,请看代码:

void func(int a = 10);
int main() {
	func();
	return 0;
}
void func(int a) {//上面声明时已经设置默认值,这里不要写默认值了
	//a默认为10
	cout << a << endl;
}

如果不相信,你可以试一下在声明和定义时都赋予默认值。结果是:


函数重载

函数重载:函数名相同的情况下,函数体可以不同。

重载的前提:

1.函数名相同

2.参数列表不同(参数个数不同,参数类型不同,参数类型相同但顺序不同)

注意:

函数的重载与函数返回值类型无关

函数重载时,确保不会因为函数参数默认值而发生二义性

1.参数个数不同

void fun(){//零个参数
    cout<<"0"<<endl;
}
void fun(int){//一个参数
    cout<<"1"<<endl;
}
void fun(int,int){//两个参数
    cout<<"2"<<endl;
}
int main(){
    fun();//0
    fun(0);//1
    fun(0,0);//2
}

2.参数种类不同

void fun(int){
    cout<<"int"<<endl;
}
void fun(float){
    cout<<"float"<<endl;
}
void fun(double){
    cout<<"double"<<endl;
}
void fun(char){
    cout<<"char"<<endl;
}
int main(){
    fun(1);//int
    fun(1.1f);//float
    fun(1.1);//double
    fun('1');//char
    return 0;
}

3.参数顺序不同

void fun(int,char){
    cout<<"int char"<<endl;
}
void fun(char,int){
    cout<<"char int"<<endl;
}
int main(){
    fun(1,'1');//int char
    fun('1',1);//char int
    return 0;
}

4.默认值与重载

上面我们就提到了,函数参数有默认值时,可以缺省一些实参的传入。那么就有一个问题:

void fun(int a){
    cout<<a<<endl;
}
void fun(int a,int b=10){
    cout<<a<<b<<endl;
}
int main()
{
    fun(3);//这里调用的是哪个fun
    return 0;
}

主函数调用的到底是哪一个fun函数呢?好像调用哪一个都行啊,编译器是不会识别你到底想调用哪个的,那么此时就存在二义性。编译器会报错:

函数重载的原理 

在C语言的学习中我们为什么没有听过函数重载的概念呢,到了C++函数为什么就能重载了呢?相信你会有这个疑问。

先简单的直接说结论:函数名修饰规则所致

C语言编译时,只将函数名作为标志,如果有另一个函数同名,无论参数一不一样都会报重定义的错误

C++编译时,将函数名与参数列表一同作为标志,具体规则我们后文学习linux时展开。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值