C++运算符重载

运算符重载是为了解决这样一类问题:我们知道对于整型可以用二元运算符(就是+,-,*,/因为这些运算都是两个变量参与,所以谓之二元,相比之下一元运算符就是自增,自减运算)直接进行运算,但对于类这样的数据结构直接的加减运算显然不被支持,这就需要用到运算符重载的概念

  • 全局函数形式----返回类型 operator关键字 运算符(参数列表)
以数学中的复数为例,运算符重载可实现实部和虚部的分别相加
#include<iostream>
using namespace std;
class complex
{
public:
    int a;
    int b;
public:
    complex(int a=0,int b=0)
    {
        this->a = a;
        this->b = b;
    }
    void printmyself()
    {
        cout << "我就是那个复数:" << this->a << "+" << this->b << "i" << endl;
    }
    
};
complex myadd(complex &c1, complex &c2)
{
    complex temp(c1.a + c2.a,c1.b+c2.b);
    return temp;
}

complex operator+(complex &c1,complex &c2)//一个典型运算符重载
{
    complex temp(c1.a+c2.a,c1.b+c2.b);
    return temp;
}

void main()
{
    //运算符重载简化 ,使得自定义数据以一种简化的方式操作
    //复数,实部相加,虚部相加
    //int a, b;
    //int c = a + b;
    complex c1(2, 3), c2(4, 5);
    complex c3;
    c3 = c1 + c2;//对于用户自定义数据类型C++默认情况下,不知道如何进行运算
    c3.printmyself();
    //运算符重载,使得用户自定义数据类型得以加载
    system("pause");
}

输出结果:

C++运算符重载

  •  成员函数形式
#include<iostream>
using namespace std;
class complex
{
public:
    int a;
    int b;
public:
    complex(int a=0,int b=0)
    {
        this->a = a;
        this->b = b;
    }
    void printmyself()
    {
        cout << "我就是那个复数:" << this->a << "+" << this->b << "i" << endl;
    }
    complex operator+(complex &c2)//左操作隐蔽不用写
    {
        this->a = this->a + c2.a;
        this->b = this->b + c2.b;
        return *this;
    }
};


void main()
{
    //运算符重载简化 ,使得自定义数据以一种简化的方式操作
    //复数,实部相加,虚部相加
    //int a, b;
    //int c = a + b;
    complex c1(2, 3), c2(4, 5);
    complex c3;
    c3 = c1.operator+(c2);//对于用户自定义数据类型C++默认情况下,不知道如何进行运算
    c3.printmyself();
    //运算符重载,使得用户自定义数据类型得以加载
    system("pause");
}
  • 友元函数形式
#include<iostream>
using namespace std;
class complex
{
public:
    int a;
    int b;
public:
    friend complex operator+(complex &c1, complex &c2);//可能出现的问题是这里的返回类型和下面实现的返回类型不一致,如果是复数都为复数,如果是引用则都为引用
    complex(int a=0,int b=0)
    {
        this->a = a;
        this->b = b;
    }
    void printmyself()
    {
        cout << "我就是那个复数:" << this->a << "+" << this->b << "i" << endl;
    }
    
};

complex operator+(complex &c1,complex &c2)
{
    complex temp(c1.a + c2.a, c1.b + c2.b);
    return temp;
}
void main()
{
    //运算符重载简化 ,使得自定义数据以一种简化的方式操作
    //复数,实部相加,虚部相加
    complex c1(2, 3), c2(4, 5);
    complex c3;
    c3 = c1 + c2;
    c3.printmyself();
    system("pause");
}