操作符重载的概念(二十四)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作符重载的概念(二十四)相关的知识,希望对你有一定的参考价值。

        我们上节学习了操作符重载,在最后我们提出了用 + 号来实现复数的相加,但是复数是不能直接相加的。那么我们下来来尝试下

#include <stdio.h>

class Complex
{
    int a;
    int b;
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }
    
    int getA()
    {
        return a;
    }
    
    int getB()
    {
        return b;
    }
};

int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2;
    
    printf("c3.a = %d\n", c3.getA());
    printf("c3.b = %d\n", c3.getB());
    
    return 0;
}

        我们来编译看看

技术分享图片

        它报错了。我们就再想着在外面添加一个 add 函数,再将 Complex c3 = c1 + c2;;改为 Complex c3 = add(c1, c2); 再在类 Complex 中将它声明为友元函数 add 函数如下

Complex add(const Complex& c1, const Complex& c2)
{
    Complex ret;
    
    ret.a = c1.a + c2.a;
    ret.b = c1.b + c2.b;
    
    return ret;
}

        我们再次进行编译,结果如下

技术分享图片

        我们看到已经编译通过,而且运行正确。所以这个解决方案不能直接支持 + 号,那怎么样才能是我们之前写的 + 号直接支持复数相加呢?这时便要用到 C++ 中的重载了,它能够扩展操作符的功能,操作符的重载以函数的方式进行,其本质是用特殊形式的函数扩展操作符的功能。通过 operator 关键字可以定义特殊的函数,operator 的本质是通过函数重载操作符,语法如下所示

技术分享图片

        下面我们通过操作符重载 operator 关键字来重新实现下 + 号的定义。将 add 函数名改为 operator + ,然后将 Complex c3 = add(c1, c2); 改为 Complex c3 = c1 + c2;我们再次进行编译,看看结果

技术分享图片

        我们发现已经能完美实现 + 号来支复数的相加了。但是还有个问题就是我们之前已经说过,要避免友元函数的出现。那么这时关于操作符重载还有一些值得说的秘密就是可以将操作符重载函数定义为类的成员函数:a> 比全局操作符重载函数少一个参数(左操作数);b> 不需要依赖友元就可以完成操作符重载;c> 编译器有限在成员函数中寻找操作符重载函数

        我们再次进行试验用以验证

#include <stdio.h>

class Complex
{
    int a;
    int b;
public:
    Complex(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
    }
    
    int getA()
    {
        return a;
    }
    
    int getB()
    {
        return b;
    }
    
    Complex operator + (const Complex& c)
    {
        Complex ret;
        printf("Complex operator + (const Complex& c)\n");
        
        ret.a = this->a + c.a;
        ret.b = this->b + c.b;
        
        return ret;
    }
    
    friend Complex operator + (const Complex& c1, const Complex& c2);
};

Complex operator + (const Complex& c1, const Complex& c2)
{
    Complex ret;
    printf("Complex operator + (const Complex& c1, const Complex& c2)\n");
    
    ret.a = c1.a + c2.a;
    ret.b = c1.b + c2.b;
    
    return ret;
}

int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2;
    
    printf("c3.a = %d\n", c3.getA());
    printf("c3.b = %d\n", c3.getB());
    
    return 0;
}

        我们先将友元函数注释掉,用类中的操作符重载函数进行试验

技术分享图片

        我们看到编译成功,并且完美运行。那么我们将友元函数和类中的重载函数都放在那,编译器会调用那个呢?我们看看编译结果

技术分享图片

        我们再来看看用友元函数来实现

技术分享图片

        那么现在已经成功实现了 + 号的操作符重载函数,支持了直接复数的相加。通过对操作符学习,总结如下:1、操作符重载是 C++ 的强大特性之一,它的本质是通过函数扩展操作符的功能;2、operator 关键字是实现操作符重载的关键;3、操作符重载遵循相同的函数重载规则;4、全局函数和成员函数都可以实现对操作符的重载。


        欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083

以上是关于操作符重载的概念(二十四)的主要内容,如果未能解决你的问题,请参考以下文章

大数据笔记(二十四)——Scala面向对象编程实例

C++进阶第二十四篇——布隆过滤器(概念+实现+海量数据处理问题)

Unity 游戏框架搭建 2019 (二十二十四) 备份与版本号&危险的操作

WPF学习第二十四章 基于范围的控件

QT开发(二十四)——QT文件操作

第二十四章 在线会话管理——《跟我学Shiro》