重载函数概念
重载函数:是函数的一种特殊情况,在C++中允许同一作用域中声明一个功能类似的同名函数。这些同名函数的形参列表(参数个数或类型或类型顺序)不同。一般用来处理功能类似但数据类型不同的问题。说白了就是一个函数有多个意思。
还是来进行举例:
#include<iostream> using namespace std; int Add(int left, int right) { cout << "int Add(int left, int right)" << endl; return left + right; } double Add(double left, double right) { cout << "double Add(double left, double right)" << endl; return left + right; } int main() { cout << Add(10, 20) << endl; cout << Add(10.10, 20.20) << endl; return 0; }
要注意一个点:构不构成重载对函数的返回值没有任何要求,比如:
我们可以看到当返回值不同是不会构成重载。上面定义的同名函数的函数名虽然相同但是参数不同,既然上图不构成重载函数的话当然就不能编译通过了,所以就会报错即仅仅是函数的返回值不同的话是不构成函数重载的。而参数不同主要分为三种类型的参数不同:参数个数、参数类型、参数顺序。上面演示的是参数类型不同,同时再次强调函数重载对函数的返回值是没有要求的(比如两个函数的函数相同,参数也相同,但是函数的返回值不同,此时这两个函数是不构成函数重载的)。所有对于构成函数重载的话一定是函数的参数(分为三种)不同。
参数类型不同
参数类型不同的话我们刚刚已经看到了,即int Add(int left, int right)和double Add(double left, double right)就属于参数类型不同的情况,这里构成重载。现在我们来看看当函数的类型不同时会不会构成函数重载:
int Add(int left, int right) { cout << "int Add(int left, int right)" << endl; return left + right; } double Add(double left, double right) { cout << "double Add(double left, double right)" << endl; return left + right; }
参数个数不同
参数个数不同的情况如下:
void func() { cout << "func()" << endl; } void func(int a) { cout << "func(int a)" << endl; }
我们来看看什么当一个参数也不传的时候运行起来会怎么样:
在来看看传一个参数时又会是怎么样呢?请看:
这里当参数个数不同时也会构成函数重载,这里很好理解,就不过多赘述了。
参数顺序不同
我们现在来看看当函数的参数顺序不同时是否会构成函数重载。
void func(int a, char b) { cout << "func(int a, char b)" << endl; } void func(int b, char a) { cout << "func(int b, char a)" << endl; }
上图算不算构成函数重载呢?不妨我们来运行一下:
呵呵,好可惜,编译器直接给我们报错了,那到底时什么原因导致编译器给我们报错呢?我们现在知道参数顺序不同时可以进行构成函数重载。好了,重点来了:上图代码中我们对两个函数中参数类型的顺序是没有发生改变的,我们改变的仅仅是函数参数的名字的顺序而已。所以如果我们仅仅是改变函数参数的名字的顺序的话,这里是不构成函数重载的,仔细观察我们可以看到。我们可以想一想如果我们真的传参给这个同名函数的形参的话,我们应该调用哪一个函数呢(由于函数参数类型的顺序是一样的,所以编译器不知道我们要调用哪一个函数,所以就报错了,说白了就是存在歧义,编译器不知道该调用哪个函数了)。所以这就会给我们的编译器带来很大的麻烦。那到底是怎样的函数顺序不同才可以构成函数重载呢?事实上只有函数参数的类型顺序不同才可以构成函数重载。
既然我们现在知道只有函数参数的类型发生顺序不同的时候才会构成函数重载,
下面我们就来正式的看看函数参数类型的顺序是不同的时候,是如何构成函数重载的,请看下面代码:
void func(char a, int b) { cout << "func(char a, int b)" << endl; } void func(int a,char b) { cout << "func(int a,char b)" << endl; }
我们在这里可以清楚的看到上面代码中两个函数的参数类型的顺序是不一样的,运行结果如下:
所以这才是函数参数类型的顺序发生改变是构成的函数重载。
现在我们在来看一看下面的代码是否会构成函数重载呢?
#include<iostream> using namespace std; void func() { cout << "func(char a, int b)" << endl; } void func(int a = 0) { cout << "func(int a,char b)" << endl; } int main() { //func('a', 1); //func(2, 'b'); func(); return 0; }
首先:
void func() { cout << "func(char a, int b)" << endl; } void func(int a = 0) { cout << "func(int a,char b)" << endl; }
这段代码中的函数的确构成了函数重载,但是与此同时存在这一个潜在的问题,那就是当我们无参函数的时候会出现问题,请看:
问题就出现在无参调用的时候会出现问题,即编译器(出现歧义)会进行报错,编译器不知道我们要调用哪个函数(不明确的调用),即如上图所示。
好了,以上就是对C++中函数重载的简单认识。
就到这里吧,再见啦各位!!!