运算符重载

130 阅读2分钟

运算符重载(Operator overloading),就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。

一、计算机重载的意义

从开发的角度而言,运算符重载的存在是为了提高开发效率,增加代码的可复用性,很多时候反而是简化了问题。C++强大的原因之一是支持泛型编程。泛型编程使得算法可以独立于数据类型存在。自定义的数据类型通过操作符重载具有了和内建类型同样的使用接口,然后C++的模板加持下,你的算法可以利用这种接口一致性,实现泛化。举个排序的例子,有的时候我们不仅是需要对整数数组来排序,常常也会碰到需要按字母对字符串数组实现排序。通过重载布尔运算符,就可以实现一个排序算法既可用于整数排序,也可以不经修改用于字符串排序,而不是要为两种数据类型写两套排序函数。再举个例子,数学。其实数学中也常常能碰到“运算符重载”,+号既能用来数的加和,对于两个同尺寸的矩阵而言,是将对应元素加在一起合成新的矩阵。假如你要编写一个库用于线性代数计算

二、kotlin实现运算符重载

class Complex (var real:Double,var imaginary:Double){

	//operator运算符重载关键字
    //重载运算符:Complex类型
    operator fun plus(other:Complex):Complex{
        return Complex(real+other.real,imaginary+other.imaginary)
    }
    //重载运算符:Int类型
    operator fun plus(other: Int): Complex {
        return Complex(real+other,imaginary)
    }

    override fun toString(): String {
        return "$real+${imaginary}i"
    }
}

fun main() {
    val c1=Complex(3.0,4.0)
    val c2=Complex(2.0,7.5)
    println(c1+c2)//返回结果:5.0+11.5i
    println(c1+5)//返回结果:8.0+4.0i
}

三、C++实现运算符重载

#include <iostream>

using namespace std;

class Complex {
private:
    double real;
    double imaginary;
public:
    Complex(double real, double imaginary);
    
	//operator运算符重载关键字
    Complex operator+(const Complex &b) {
        return Complex(real + b.real, imaginary + b.imaginary);
    }

    void display() const {
        cout << real << " + " << imaginary << "i" << endl;
    }
};

//函数实现
Complex::Complex(double real, double imaginary) : real(real), imaginary(imaginary) {}

int main() {
    Complex c1 = Complex(3.0, 4.0),
            c2 = Complex(2.0, 7.5);
    (c1 + c2).display();//返回结果:5.0+11.5i

    return 0;
}