C++函数重载的简单介绍

简介: C++函数重载的简单介绍

1.png重载函数概念

重载函数:是函数的一种特殊情况,在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;
}



要注意一个点:构不构成重载对函数的返回值没有任何要求,比如:

2.png

我们可以看到当返回值不同是不会构成重载。上面定义的同名函数的函数名虽然相同但是参数不同,既然上图不构成重载函数的话当然就不能编译通过了,所以就会报错即仅仅是函数的返回值不同的话是不构成函数重载的。而参数不同主要分为三种类型的参数不同:参数个数、参数类型、参数顺序。上面演示的是参数类型不同,同时再次强调函数重载对函数的返回值是没有要求的(比如两个函数的函数相同,参数也相同,但是函数的返回值不同,此时这两个函数是不构成函数重载的)。所有对于构成函数重载的话一定是函数的参数(分为三种)不同。


参数类型不同

参数类型不同的话我们刚刚已经看到了,即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;
}

3.png


参数个数不同

参数个数不同的情况如下:

void func()
{
  cout << "func()" << endl;
}
void func(int a)
{
  cout << "func(int a)" << endl;
}


我们来看看什么当一个参数也不传的时候运行起来会怎么样:

4.png

在来看看传一个参数时又会是怎么样呢?请看:

5.png

这里当参数个数不同时也会构成函数重载,这里很好理解,就不过多赘述了。


参数顺序不同

我们现在来看看当函数的参数顺序不同时是否会构成函数重载。

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;
}


上图算不算构成函数重载呢?不妨我们来运行一下:

6.png

呵呵,好可惜,编译器直接给我们报错了,那到底时什么原因导致编译器给我们报错呢?我们现在知道参数顺序不同时可以进行构成函数重载。好了,重点来了:上图代码中我们对两个函数中参数类型的顺序是没有发生改变的,我们改变的仅仅是函数参数的名字的顺序而已。所以如果我们仅仅是改变函数参数的名字的顺序的话,这里是不构成函数重载的,仔细观察我们可以看到。我们可以想一想如果我们真的传参给这个同名函数的形参的话,我们应该调用哪一个函数呢(由于函数参数类型的顺序是一样的,所以编译器不知道我们要调用哪一个函数,所以就报错了,说白了就是存在歧义,编译器不知道该调用哪个函数了)。所以这就会给我们的编译器带来很大的麻烦。那到底是怎样的函数顺序不同才可以构成函数重载呢?事实上只有函数参数的类型顺序不同才可以构成函数重载。

既然我们现在知道只有函数参数的类型发生顺序不同的时候才会构成函数重载,

下面我们就来正式的看看函数参数类型的顺序是不同的时候,是如何构成函数重载的,请看下面代码:

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;
}


我们在这里可以清楚的看到上面代码中两个函数的参数类型的顺序是不一样的,运行结果如下:

7.png

所以这才是函数参数类型的顺序发生改变是构成的函数重载。

现在我们在来看一看下面的代码是否会构成函数重载呢?

#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;
}


这段代码中的函数的确构成了函数重载,但是与此同时存在这一个潜在的问题,那就是当我们无参函数的时候会出现问题,请看:

8.png

问题就出现在无参调用的时候会出现问题,即编译器(出现歧义)会进行报错,编译器不知道我们要调用哪个函数(不明确的调用),即如上图所示。


好了,以上就是对C++中函数重载的简单认识。

就到这里吧,再见啦各位!!!

目录
相关文章
|
24天前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
17 3
|
5月前
|
编译器 C++
C++进阶之路:何为命名空间、缺省参数与函数重载
C++进阶之路:何为命名空间、缺省参数与函数重载
38 3
|
24天前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
20 0
|
6月前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
1月前
|
自然语言处理 编译器 Linux
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
|
1月前
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
21 0
|
3月前
|
编译器 程序员 C语言
C++函数重载
在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似: void swap1(int *a, int *b); //交换 int 变量的值 void swap2(float *a, float *b); //交换 float 变量的值 void swap3(char *a, char *b); //交换 char 变量的
C++函数重载
|
3月前
|
编译器 Linux C语言
【C++小知识】为什么C语言不支持函数重载,而C++支持
【C++小知识】为什么C语言不支持函数重载,而C++支持
|
3月前
|
安全 编译器 C++
C++入门 | 函数重载、引用、内联函数
C++入门 | 函数重载、引用、内联函数
32 5
|
4月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用