(原创作品,欢迎批评,转载请保留作者信息)
对一些常见用户类型,经常要用到运算符重载,以尽量接近常规数学的方式书写C++程序,这将极大地增强C++程序的可读性和表达能力。比如说,向量算法,矩阵算法,数组操作等等。掌握几个常见的操作符的重载,对提高C++编程水平有不小的功效。
1。+,-,*,/(加减乘除)
相同用户类型之间的运算,以及用户类型与内部类型(built-in type)之间的运算。一般通过重载来支持这两种应用。内部类型的多样性一般通过模板类来实现。
运算符重载的语法完全取决于应用,但大多数情况下,应当完全等价于内部类型的加减乘除。
比如一个简单的加法:a+b,这里面有几点:
a,b在运算过程中不会被改变 (C++通过const来表明这一点)
a+b我们期望返回一个结果,这个结果应当是什么类型取决于用户定义的规则。比如,一个数组和一个标量相加,我们期望得到一个新的数组。这一点C++通过返回类型来定义。因为返回值是一个临时变量(或对象),因此不能是const,也不能是引用。
vec<T> operator+(const T& a) const; //对成员函数, T为内部类型 此处假设vec是一个向量类。
vec<T> operator+(const vec<T>& v) const;//对成员函数,相同类型
在实现时应当首先构造一个临时对象,计算完毕返回这个对象。
比如:
vec<T> tmp;
for(i=0;i<v.size();i++) tmp[i]=a[i]+b[i];
return tmp;
2. +=,-=,*=,/=
a+=b 干什么了呢?
首先执行a+b并把结果存入a, 这里面没有通过一个临时变量的过程。因此这种方法要更高效一些。
运算符重载也是同样的道理,b在此过程中是不变的,因此应定义为const &. 返回结果仍然是a本身,因此也应当是引用。
vec<T>& operator+=(const T&a);
vec<T>& operator+=(const vec& v);
返回类型不应当是const,对成员函数本身也不是常量类型。返回引用类型也是为了连等表达式。
3。赋值=
等号在运算符重载里有特殊的地位。可以来实现许多表达形式。我们先说说普通情况下:
a=b
这种情况下,我们一般定义左边与右边。左边一般要求是个变量名字,右边是一个表达式。右边表达式计算得到的结果必须可以显式或者隐式转化为左边的类型。这种赋值才可进行。
左边的对象值都被右边的替代。如果内部没有数组,指针,引用等,赋值操作不需要自己定义。可以使用系统自动生成的赋值操作。
自动的赋值操作为:vec<T>& operator=(const vec<T>& b);
如果默认赋值不能满足要求,必须重载=运算符。
其实=并不要求返回一个左边的引用,这个是为了使用连等,比如说a=b=c=d