C语言到C++(4) - 重载

作者: 天花板 | 来源:发表于2017-05-05 08:36 被阅读702次

C++中新增了重载功能,重载分为两部分,函数重载和运算符重载。

1. 函数重载

在C语言编程中,我们经常遇到一组函数完成同一类功能的情况。比如:

int MaxInt(int a, int b);
long MaxLong(long a, long b);
float MaxFloat(float a, float b);

这三个函数的功能都是从a和b中找出大的那个输出。每次遇到这种问题,最麻烦的就是要想三个不同的函数名去命名。如今,在C++中,我们可以让它们共用同一个函数名。

int Max(int a, int b);
long Max(long a, long b);
float Max(float a, float b);

我们来看看它们是如何工作的:

#include <iostream>

using namespace std;

int Max(int a, int b)
{
    cout << "-> Call Max Int" << endl;
    return a > b ? a : b;
}

long Max(long a, long b)
{
    cout << "-> Call Max Long" << endl;
    return a > b ? a : b;
}

float Max(float a, float b)
{
    cout << "-> Call Max Float" << endl;
    return a > b ? a : b;
}

int main()
{
    int nA = 1;
    int nB = 2;
    float fA = 3.0f;
    float fB = 4.0f;
    long lA = 10;
    long lB = 11;

    cout << "Max(nA, nB) : " << Max(nA, nB) << endl;
    cout << "Max(fA, fB) : " << Max(fA, fB) << endl;
    cout << "Max(lA, lB) : " << Max(lA, lB) << endl;

    return 0;
}

执行结果:

在C++中,允许在同一个作用域中使用同一个函数名定义多个函数,只要这些函数的参数个数或参数类型不同即可。

函数重载注意

  • 可以利用参数个数区分
  • 可以利用参数类型区分
  • 不能利用返回值区分

在C++内部,有种能够唯一标识函数的东西叫做函数签名。函数签名与函数名、参数个数和参数类型有着紧密的关系,唯独与返回值无关。道理其实很简单,在调用函数时,如果不接收返回值,比如:

   int Fun()
   {
       return 0;
   }

   long Fun()
   {
       return 1;
   }

   void main()
   {
       Fun();
   }

main函数中,我们如何通过返回值判断它调用的是哪个函数呢?如果我们都判断不出,那么计算机如何能够判断的出呢。

2. 运算符重载

C语言到C++(1) - 基本变化中,我们介绍了cincout的使用,其中会用到<<>>。在C语言中,这两个是位运算符,而到了C++中,它们又增加了表示stream的功能,这就是运算符重载。

我们举一个常用的例子,在C语言中,比较运算符只能比较基本数据类型,如:

int a = 0;
int b = 1;

if(a < b)
{
    // Do something
}

但如果我们需要比较两个结构体的大小呢?看看这段代码:

#include <iostream>

using namespace std;

typedef struct _tagNode
{
    int m_x;
    int m_y;
}Node;

bool operator < (const Node& node1, const Node& node2)
{
    if ((node1.m_x + node1.m_y) < (node2.m_x + node2.m_y))
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{

    Node n1 = { 1, 2 };
    Node n2 = { 3, 4 };

    if (n1 < n2)
    {
        cout << "n1 is min" << endl;
    }
    else
    {
        cout << "n2 is min" << endl;
    }

    return 0;
}

n1和n2是两个Node类型的结构体,我们想要用“<”比较它们,就需要通过运算符重载的方式定义一个“<”的新功能。

bool operator < (const Node& node1, const Node& node2)

在这个函数的定义中,制定了一个比较两个Node数据类型的规则,就是比较它们两个成员变量之和。程序的执行结果如下:

我是天花板,让我们一起在软件开发中自我迭代。
如有任何问题,欢迎与我联系。


上一篇:C语言到C++(3) - 引用

相关文章

  • C语言到C++(4) - 重载

    C++中新增了重载功能,重载分为两部分,函数重载和运算符重载。 1. 函数重载 在C语言编程中,我们经常遇到一组函...

  • 30小时快速精通C++拾遗

    C语言不支持重载,为什么C++支持重载? C语言不支持函数重载,编译时函数名加上_或者其他标识C++为什么能够重载...

  • 1.2.15_C++ 关系运算符重载

    C++ 重载运算符和重载函数 C++ 语言支持各种关系运算符( < 、 > 、 <= 、 >= 、 == 等等),...

  • C++运算符重载的方法详细解析

    C++运算符重载的方法详细解析_C 语言_脚本之家

  • 高质量C++编程指南 ----C++函数的高级特性

    8. C++函数的高级特性 对比于C 语言的函数,C++增加了重载(overloaded)、内联(inline)、...

  • c和c++的关系

    1 在c++中调用被c编译器编译后的函数,为什么要加extern "c"; 因为c++语言支持函数重载,而c语言不...

  • 关于C++与C

    C语言是C++的基础,要能够明确的区分C与C++的内容 C语言中的结构体,const,运算符重载,int *x与i...

  • 01-函数重载(Overload)

    我们知道,在C语言当中,是不支持函数重载的,但是C++支持函数重载,并且有很多语言都支持函数重载。 例如下列的两个...

  • c++的运算符重载

    C++中的加号重载:例:实现复数的相加 C++中的前置++重载:例:点的移动 C++中的后置++重载:例:点的移动

  • 1.2.17_C++ ++ 和 -- 运算符重载

    C++ 重载运算符和重载函数 递增运算符( ++ )和递减运算符( -- )是 C++ 语言中两个重要的一元运算符...

网友评论

本文标题:C语言到C++(4) - 重载

本文链接:https://www.haomeiwen.com/subject/uznrtxtx.html