码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-05-21 16:18:33      阅读:175      评论:0      收藏:0      [点我收藏+]

标签: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;
    }
};

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

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

标签:C++   操作符重载   全局函数重载   成员函数重载   

原文地址:http://blog.51cto.com/12810168/2118707

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!