C/C++运算符重载

1、前言

今天要和大家分享的是C++的重载运算符,我第一次看到它的感觉是崩溃滴,完全不理解其规则,今天就写一篇文章以作学习记录吧!

C++语言中的数据类型分为基础数据类型和构造数据类型,其中基础数据类型可以直接完成算术运算,但是对于构造的数据类型(如对象)就无法直接求和了,我们先来看一个示例。

class Complex 
{
private: 
    double a; 
    double b; 
public: 
    complex(double r,double i){
        a=r;
        b=i;
    } 
    void display(); 
}; 
Complex cpx1(10,20),cpx2(5,8); 

那此时“cpx1+cpx2”应该如何计算呢?此时如果想实现两个雷对象的加法运算有两种方法,一种是通过成员函数(不利于代码复用和多对象累加),另外一种就是重载运算符。

2、理论

C++的重载运算符不可是新创建的运算符,只能是C++语言中已有的运算符,可以重载的运算符如下:

C/C++运算符重载_第1张图片

运算符重载实质上是函数的重载,运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。
运算符重载为类的成员函数的一般语法形式为:

函数类型 operator 运算符(形参表)
{
函数体;
}
运算符重载为类的友元函数的一般语法形式为:

friend 函数类型 operator 运算符(形参表)
{
函数体;
}
其中,函数类型就是运算结果类型,operator是定义运算符重载函数的关键字,运算符是重载的运算符名称。
当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个,当重载为类的友元函数时,参数个数与原操作数个数相同。原因是重载为类的成员函数时,如果某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进行传递,少了的操作数就是该对象本身。而重载为友元函数时,友元函数对某个对象的数据进行操作,就必须通过该对象的名称来进行,因此使用到的参数都要进行传递,操作数的个数就不会有变化。
运算符重载的主要优点就是允许改变使用于系统内部的运算符的操作方式,以适应用户自定义类型的类似运算。

为了说明把运算符重载后,执行表达式就是调用函数的过程,可以把两个整数相加也想象称为调用下面的函数:

int operator +(int a,int b)
{
    return (a+b);
}

如果有表达式5+8,就调用此函数,将5和8作为调用函数时的形参,函数的返回值为13,这就是通过函数的方法理解运算符重载。

3、示例

//运算符重载
class Complex {

public:
    double a, b;
    Complex() {
        a = 0;
        b = 0;
    }

    Complex(double r, double i) {
        a = r;
        b = i;
    }

    //重载了对象的+-*/四则运算
    Complex operator+(Complex &c1);
    Complex operator*(Complex &c1);
    //类的友元函数
    friend Complex operator-(Complex &c1, Complex &c2);
    friend Complex operator/(Complex &c1, Complex &c2);
};

Complex Complex::operator +(Complex &c1) {
    return Complex(a + c1.a, b + c1.b);
}

Complex Complex::operator *(Complex &c1) {
    return Complex(a * c1.a, b * c1.b);
}

//友元函数
Complex operator -(Complex &c1, Complex &c2) {
    return Complex(c1.a - c2.a, c1.b - c2.b);
}

Complex operator /(Complex &c1, Complex &c2) {
    return Complex(c1.a / c2.a, c1.b / c2.b);
}

void display(Complex &c) {
    cout << c.a << ":" << c.b << endl;
}

测试程序和运行结果为:

//测试程序
Complex cpx1(20, 20), cpx2(10, 10), cpx3;
cpx3 = cpx1 + cpx2;
//cpx3 = cpx1.operator +(cpx2);
display(cpx3);

cpx3 = cpx1 * cpx2;
display(cpx3);

cpx3 = cpx1 - cpx2;
display(cpx3);

cpx3 = cpx1 / cpx2;
display(cpx3);

//运行结果
30:30
200:200
10:10
2:2

好啦,到此我们就将C++的重载运算符简单的分析了一下,重载运算符有很多所以也不能一一的详述,只能在以后的开发过程中去学习。

你可能感兴趣的:(C/C++)