C++重载的奥义之函数重载详解

 更新时间:2023年04月18日 10:40:07   作者:Sharemaker  
函数重载是C++多态(静态多态)的特征体现,它可以允许重复使用同一个函数名(篮子)的函数,但是函数的参数列表(篮子装的东西)是可以不一样的。下面就简单讲讲C++中函数重载的相关应用吧

一、基本定义        

重载,顾名思义从字面上理解就是重复装载,打一个不恰当的比方,你可以用一个篮子装蔬菜,也可以装水果或者其它,使用的是同一个篮子,但是可以用篮子重复装载的东西不一样。

函数重载是C++多态(静态多态)的特征体现,它可以允许重复使用同一个函数名(篮子)的函数,但是函数的参数列表(篮子装的东西)是可以不一样的。这样就可以利用函数的重载功能设计一系列功能相近,但是功能细节不一样的函数接口。

二、应用举例        

以同一个函数printData为例:

#include <iostream>
using namespace std;

void printData(const char *str, int num)
{
  //函数体;
}

void printData(const char *str)
{
  //函数体;
}

void printData(double data, int num)
{
  //函数体;
}

void printData(int data, int num)
{
  //函数体;
}

void printData(long data, char num)
{
  //函数体;
}

class Test
{
  public:
         void MyPrint(int num) {cout << "class int: " << num << endl;}
         void MyPrint(float num) {cout << "class float: " << num << endl;}
         void MyPrint(char num) {cout << "class char: " << num << endl;}
};

int main(void)
{
  printData("hello", 5); // (const char *str, int num)
  printData("hello"); // (const char *str)
  printData(1993.0, 97);
  printData(1993, 98);
  printData(1993L, 99);
  Test test1;
  test1.MyPrint(2); // class int: 2
  test1.MyPrint(2.0f); // class float: 2.0 浮点型必须要显式类型,否则编译器不知道该转换为int还是float。
  test1.MyPrint("hello"); // class char: hello
  return 0;
}

使用重载函数时,需要在函数调用中使用与对应的重载函数匹配的函数参数类型。

而如下:

unsigned int para = 4321;
printData(4321, 5);

此时的printData调用和哪个原型匹配呢?答案它不与任何函数原型匹配,而没有匹配的原型不会停止调用其中某一个函数,C++会尝试用标准的强制类型转换与之匹配,比如使用 printData(double data, int num),就可以将para的类型强制转换为double类型。但是还有printData(int data, int num)和printData(long data, char num)这两个函数可以强制转换para。因此,C++将拒绝这种函数的调用,将这种调用视为错误。

重载函数通常用在同一个作用域内,用同一个函数名命名一组功能相似的函数,这样做减少了函数名的数量,提高了函数的通用性,避免了名字空间的污染,对于程序的可读性有很大的好处。

三、非函数重载的情况

下面这种两种情况不能视为函数重载:

 int fun(int a);
 int fun(int &a);

从编译器的角度出发,参数a与参数列表原型int a和int &a都匹配,编译器无法确定使用哪个函数,为避免这种混乱,编译器在检查参数类型时将把类型本身和类型引用看作是同一个特征类型。

int fun(int a, float b);
double fun(int a, float b);

C++不允许这样的方式重载函数,虽然返回值可以不一样,但是参数列表必须不一样。

四、函数重载的使用原则

(1)、仅当函数的基本功能比较相近,但是需要使用不同形式的参数实现功能时才应该使用函数重载,尽量不要用同一函数名去实现完全不相干的功能;

(2)、在同一个作用范围内使用函数重载,同一个范围即:同一个命名空间或者同一个类等;

(3)、重载函数的名称必须相同,函数的参数列表须不相同,即参数列表中参数的类型,参数的个数或参数的顺序不相同;

(4)、重载函数可以有相同的返回值类型或者不同的返回值类型,反之仅仅是返回类型不同不足以作为函数的重载。

五、FAQ

1、C++中对函数重载是如何处理的?

在.cpp文件中,虽然两个函数的函数名一样,但是,C++编译器在内部使用“名称修饰”或“名称矫正”转换,它根据函数中参数列表的区别为每个函数进行加密 ,例如:

int fun(int a, float b)和double fun(int a, float b)

编译器在内部可以转换为:

?fun@@YAHHH@Z和?fun@@YAMMM@Z

"?"表示名称开始,"?"后边是函数名;“@@YA”表示参数表开始,后边的3个字符分别表示返回值类型,两个参数类型;“@Z”表示名称结束。

由于在.cpp文件中,两个函数生成的符号表中字符的名称不一样,所以是可以编译通过的。

2、C语言中为什么不能支持函数重载?

编译器在编译.c文件时,只会给函数进行简单的重命名。具体的方法是给函数名之前加上"_”;所以编译前两个函数名相同的函数在编译之后的函数名也照样相同;因此调用时会因为不知道到底调用哪个而出错。

int fun(int a, float b)和double fun(int a, float b)

编译器在内部都转换为:_fun,无法区分,

只有不同的函数名字int fun1(int a, float b)和double fun2(int a, float b)

编译器在内部转换为:_fun1和_fun2,这才能区分开来。

以上就是C++重载的奥义之函数重载详解的详细内容,更多关于C++函数重载的资料请关注脚本之家其它相关文章!

相关文章

  • c++入门必学算法之快速幂思想及实现

    c++入门必学算法之快速幂思想及实现

    快速幂相较于普通的幂,具有占用空间少,效率更高等优点,全面碾压普通的幂,下面这篇文章主要给大家介绍了关于c++入门必学算法之快速幂思想及实现的相关资料,需要的朋友可以参考下
    2022-11-11
  • 利用Matlab实现图像亮度分布统计图

    利用Matlab实现图像亮度分布统计图

    这篇文章主要介绍了如何利用Matlab实现图像亮度分布统计图的绘制,文中的示例代码讲解详细,对我们学习Matlab有一定的帮助,感兴趣的可以了解一下
    2022-05-05
  • Qt跨平台窗口选择功能的实现过程

    Qt跨平台窗口选择功能的实现过程

    很多时候为了方便软件的使用,我们需要让编写的界面程序显示在最上层,这时候就需要对窗口属性进行调整,下面这篇文章主要给大家介绍了关于Qt跨平台窗口选择功能的实现过程,需要的朋友可以参考下
    2022-12-12
  • C++实现查找二叉树中和为某一值的所有路径的示例

    C++实现查找二叉树中和为某一值的所有路径的示例

    这篇文章主要介绍了C++实现查找二叉树中和为某一值的所有路径的示例,文中的方法是根据数组生成二叉排序树并进行遍历,需要的朋友可以参考下
    2016-02-02
  • 基于Matlab实现俄罗斯方块游戏

    基于Matlab实现俄罗斯方块游戏

    俄罗斯方块是一个最初由阿列克谢帕吉特诺夫在苏联设计和编程的益智类视频游戏。本文将利用Matlab实现这一经典的小游戏,需要的可以参考一下
    2022-03-03
  • 解析C/C++指针、函数、结构体、共用体

    解析C/C++指针、函数、结构体、共用体

    这篇文章主要介绍了C/C++指针、函数、结构体、共用体的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • C语言打印输出杨辉三角

    C语言打印输出杨辉三角

    这篇文章主要为大家详细介绍了C语言打印输出杨辉三角,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C++11基于范围的for循环代码示例

    C++11基于范围的for循环代码示例

    这篇文章主要给大家介绍了关于C++11基于范围的for循环的相关资料,范围for循环(也称为C++11的基于范围的for循环)是一种简化迭代容器(如数组、向量、列表等)元素的方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • C++ 通过指针实现多态实例详解

    C++ 通过指针实现多态实例详解

    这篇文章主要介绍了 C++ 通过指针实现多态实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • C++消息队列(定义,结构,如何创建,发送与接收)

    C++消息队列(定义,结构,如何创建,发送与接收)

    这篇文章主要介绍了C++消息队列(定义,结构,如何创建,发送与接收),消息队列是一种先进先出的队列型数据结构,实际上是系统内核中的一个内部链表
    2022-08-08

最新评论