您的位置:首页 > 财经 > 产业 > C++函数重载

C++函数重载

2024/12/22 19:30:46 来源:https://blog.csdn.net/U2396573637/article/details/141245748  浏览:    关键词:C++函数重载

函数参数默认值

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

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

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

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

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

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

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

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

void func(int a = 10);
int main() {func();return 0;
}
void func(int a) {//上面声明时已经设置默认值,这里不要写默认值了//a默认为10cout << 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();//0fun(0);//1fun(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);//intfun(1.1f);//floatfun(1.1);//doublefun('1');//charreturn 0;
}

3.参数顺序不同

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

4.默认值与重载

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

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

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

函数重载的原理 

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

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

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com