亲宝软件园·资讯

展开

C++操作符重载

清风自在 流水潺潺 人气:0

一、需要解决的问题

下面的复数解决方案是否可行?

下面看一下复数的加法操作:

#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;
    }
    friend Complex Add(const Complex& p1, const Complex& p2);
};
Complex Add(const Complex& p1, const Complex& p2)
{
    Complex ret;
    ret.a = p1.a + p2.a;
    ret.b = p1.b + p2.b;
    return ret;
}
int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = Add(c1, c2); // c1 + c2
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    return 0;
}

输出结果如下:

思考

Add 函数可以解决 Complex 对象相加的问题,但是 Complex 是现实世界中确实存在的复数,并且复数在数学中的地位和普通的实数相同。

为什么不能让+操作符也支持复数相加呢?这个就涉及到操作符的重载。

二、操作符重载

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;
    }
    friend Complex operator + (const Complex& p1, const Complex& p2);
};
Complex operator + (const Complex& p1, const Complex& p2)
{
    Complex ret;
    ret.a = p1.a + p2.a;
    ret.b = p1.b + p2.b;
    return ret;
}
int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2; // operator + (c1, c2)
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    return 0;
}

输出结果如下:

可以将操作符重载函数定义为类的成员函数

下面来实现在成员函数中重载操作符:

#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& p)
    {
        Complex ret;
        printf("Complex operator + (const Complex& p)\n");
        ret.a = this->a + p.a;
        ret.b = this->b + p.b;
        return ret;
    }
    friend Complex operator + (const Complex& p1, const Complex& p2);
};
Complex operator + (const Complex& p1, const Complex& p2)
{
    Complex ret;
    printf("Complex operator + (const Complex& p1, const Complex& p2)\n");
    ret.a = p1.a + p2.a;
    ret.b = p1.b + p2.b;
    return ret;
}
int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2; // c1.operator + (c2)
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    return 0;
}

输出结果如下:

这个说明编译器优先在成员函数中寻找操作符重载函数

故上述代码可以直接写成:

#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& p)
    {
        Complex ret;
        ret.a = this->a + p.a;
        ret.b = this->b + p.b;
        return ret;
    }
};
int main()
{
    Complex c1(1, 2);
    Complex c2(3, 4);
    Complex c3 = c1 + c2; // c1.operator + (c2)
    printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());
    return 0;
}

三、小结

加载全部内容

相关教程
猜你喜欢
用户评论