0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++中函数重载的使用

CHANBAEK 来源:明解嵌入式 作者:Sharemaker001 2023-04-15 11:22 次阅读

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

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

#include 
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)、重载函数可以有相同的返回值类型或者不同的返回值类型,反之仅仅是返回类型不同不足以作为函数的重载。

常见问题:

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语言
    +关注

    关注

    180

    文章

    7598

    浏览量

    136184
  • 函数
    +关注

    关注

    3

    文章

    4304

    浏览量

    62429
  • C++
    C++
    +关注

    关注

    22

    文章

    2104

    浏览量

    73489
  • 编译器
    +关注

    关注

    1

    文章

    1618

    浏览量

    49048
  • void
    +关注

    关注

    0

    文章

    23

    浏览量

    9856
收藏 人收藏

    评论

    相关推荐

    C++重载运算符和重载函数详解

    在计算机程序设计,运算符重载(英语:operator overloading)是多态的一种。这里,运算符(比如+,=或==)被当作多态函数,它们的行为随着其参数类型的不同而不同。运算符并不一定总是符号。
    发表于 09-20 17:14 1806次阅读

    关于C++函数重载机制

    重载机制是一种"假的"多态.(因为他是在编译阶段就进行分配的机制).另外,C++还有一种"假的"多态机制就是模板机制,同样只是改变函数参数的类型,并不会改变
    发表于 10-01 17:18

    函数重载隐藏覆盖的区别

    ,两个函数Add();在同一作用域,函数名相同都是Add,参数类型不同;就构成了c++函数重载
    发表于 05-11 09:33

    嵌入式-C++函数重载

    一、什么是函数重载 两个以上的函数,具有相同的函数名,通过参数的类型和参数的个数不同。编译器自行匹配,自动确定调用哪一个函数 二、
    发表于 06-28 13:54

    C++语言入门教程之C++语言程序设计函数的详细资料概述免费下载

    本文档的主要内容详细介绍的是C++语言入门教程之C++语言程序设计函数的详细资料概述免费下载内容包括了:1 函数的定义和使用2 函数的参数传
    发表于 09-20 14:51 23次下载

    C++程序设计教程之运算符重载的详细资料说明

    本文档详细介绍的是C++程序设计教程之运算符重载的详细资料说明主要内容包括了:1. 什么是运算符重载,2. 运算符重载的方法,3. 重载运算
    发表于 03-14 16:04 4次下载
    <b class='flag-5'>C++</b>程序设计教程之运算符<b class='flag-5'>重载</b>的详细资料说明

    如何在中断C函数调用C++

    之前,我们在单片机程序开发时都会面对中断函数。众所周知的,这个中断函数肯定是要用C函数来定义的。我在用C++进行程序开发的时候就发现了一个需
    发表于 05-09 18:17 0次下载
    如何在中断<b class='flag-5'>C</b><b class='flag-5'>函数</b><b class='flag-5'>中</b>调用<b class='flag-5'>C++</b>

    C++之操作符重载学习的总结

    操作符重载c++的强大特性之一;操作符重载的本质是通过函数扩展操作符的功能;operator 关键字是实现操作符重载的关键。
    的头像 发表于 12-24 16:36 647次阅读

    C++之类函数重载学习的总结

    类的成员函数之间可以进行重载重载必须发生在同一个作用域中;全局函数和成员函数不能构成重载关系;
    的头像 发表于 12-24 17:02 489次阅读

    C++重载函数学习总结

    函数重载c++c的一个重要升级;函数重载通过参数列表区分不同的同名
    的头像 发表于 12-24 17:10 778次阅读

    EE-128:C++的DSP:从C++调用汇编类成员函数

    EE-128:C++的DSP:从C++调用汇编类成员函数
    发表于 04-16 17:04 2次下载
    EE-128:<b class='flag-5'>C++</b><b class='flag-5'>中</b>的DSP:从<b class='flag-5'>C++</b>调用汇编类成员<b class='flag-5'>函数</b>

    适合具备 C 语言基础的 C++ 入门教程(二)

    在上一则教程,通过与 C 语言相比较引出了 C++ 的相关特性,其中就包括函数重载,引用,this 指针,以及在脱离 IDE 编写
    发表于 01-25 19:13 1次下载
    适合具备 <b class='flag-5'>C</b> 语言基础的 <b class='flag-5'>C++</b> 入门教程(二)

    深度解析C++的虚函数

    函数作为C++的重要特性,让人又爱又怕,爱它功能强大,但又怕驾驭不好,让它反咬一口,今天我们用CPU的角度,撕掉语法的伪装,重新认识一下虚函数。 虚函数
    的头像 发表于 02-15 11:14 811次阅读
    深度解析<b class='flag-5'>C++</b><b class='flag-5'>中</b>的虚<b class='flag-5'>函数</b>

    C++不一样的重载是什么

    这里想分享C++中一个不一样的重载,即const重载
    的头像 发表于 02-21 14:02 741次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>不一样的<b class='flag-5'>重载</b>是什么

    C++基础知识之函数1

    函数C++ 的一个重要概念,它可以让我们将一段代码封装起来,然后在需要的时候调用它。C++
    的头像 发表于 04-03 10:34 534次阅读