C++ 函数重载(overload)
目录
函数重载(overload)
在传统的C语言中,函数名必须是唯一的,程序中不允许出现同名的函数。在C++中是允许出现同名的函数,这种现象称为函数重载。
函数重载的目的就是为了方便的使用函数名。
函数重载原理
编译器为了实现函数重载,也是默认为我们做了一些幕后的工作,编译器用不同的参数类型来修饰不同的函数名,比如void func();编译器可能会将函数名修饰成_func,当编译器碰到void func(int x),编译器可能将函数名修饰为_func_int,当编译器碰到void func(int x,char c),编译器可能会将函数名修饰成_func_int_char,以此作为区分。
函数重载切记要避免二义性,只能以参数作为唯一的区别。
返回值,函数名,作用域必须一样!
全局变量和类成员函数同名,不叫函数重载,因为作用域不一样!
.h
void func();
void func(int x);
void func(int x,double y);
void func(double x,int y);
.cpp
void func()
{
qDebug()<<"无参数";
}
void func(int x)
{
qDebug()<<"int x";
}
void func(int x,double y)
{
qDebug()<<"int x,double y";
}
void func(double x,int y)
{
qDebug()<<"double x,int y";
}
func();//无参数
func(1);//int x
func(1,1.2);//int x,double y
func(1.2,3);//double x,int y
什么情况下,函数不能被重载
内容来源:C++函数重载(2) - 不能被重载的函数 https://blog.csdn.net/shltsh/article/details/45938663
仅仅是返回值不同
#include<iostream>
int foo() {
return 10;
}
char foo() {
return 'a';
}
int main()
{
char x = foo();
getchar();
return 0;
}
————————————————
版权声明:本文为CSDN博主「水草」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shltsh/article/details/45938663
成员函数名称以及参数完全相同,仅仅其中一个是static成员函数
函数参数仅仅是指针与数组的差别。这样实际上是相等的
函数差别仅在于参数类型,其中一个是函数类型,另一个是相同类型的函数指针。这样实际上是相等的
也间接证明了函数当参数的时候会退化为指针
int fun(int *ptr);
int fun(int ptr[]); //相当于fun(int *ptr)的重复声明
————————————————
版权声明:本文为CSDN博主「水草」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shltsh/article/details/45938663
函数参数差别仅在于有无const,按值传递不可以,按指针传递可以,常函数可以
按值传递,修改与否都不影响原来的值,但是按照引用和指针传递,会影响
函数之间的差别仅在于默认参数值的不同。这样实际上也是相等的
#include<iostream>
#include<stdio.h>
using namespace std;
int f ( int x, int y) {
return x+10;
}
int f ( int x, int y = 10) {
return x+y;
}
int main() {
getchar();
return 0;
}
————————————————
版权声明:本文为CSDN博主「水草」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shltsh/article/details/45938663
默认参数及引用参数
默认参数:
void func(int x)
{
qDebug()<<"int x";
}
void func(int x,double y = 2.2)
{
qDebug()<<"int x,double y";
}
这种情况,函数重载会报错。
以上就会报错,因为二义性,书写语句func(1);程序也不知道是调用哪儿个函数,可以是第一个,也可以是第二个。
引用参数:
.h
void func(int x);
void func(const int & x);
.cpp
void func(int x)
{
qDebug()<<"int x";
}
void func(const int & x)
{
qDebug()<<"const int & x";
}
不同编译器会有不一样的结果,注意,使用引用传递参数时,一定要是有效的内存地址,不要是什么局部变量。
使用默认参数和引用时一定要小心和注意。
使用默认参数注意事项
唯一要注意的,从默认参数起,往右,全部都要是默认参数
void func(int i,int j = 1,int y = 0);//没有问题
void func(int i,int j = 1,int y);//有问题
调用的时候,可以给默认参数再次赋值
//.h
void func(int i,int j = 1);
//.cpp
void func(int i,int j = 1)
{
.....
}
......
func(1);//ok
func(1,2);//ok,给默认参数重新赋值
......
更多推荐



所有评论(0)