运算符重载
运算符重载是一种形式的C++多态,运算符重载将前面的函数重载重载运用到运算符上,允许赋予C++运算符多种含义。实际上许多C++(也包括C语言)运算符都已经被重载。C++根据操作数的数量和类型确定使用那种运算符。C++允许将运算符重载扩展到用户自定义的类型。
例如相加两个数组一般写法是
for (int i = 0; i < size; i++){
dest[i] = s1[i] + s2[i];
}
但是通过重载运算符可以写成
dest = s1 + s2;
这种简单的加法隐藏了内部实质,并强调了实质,这是OOP另一个目标。
要重载运算符,需要使用被称为运算符函数的特殊函数形式,运算符函数的格式如下
operator运算符 (参数列表);
operator+ (const Car&);
其中运算符必须有效,不能建立一个新的运算符,比如@。
来看一个简单的加法实例
// Array20.h
#ifndef ARRAY20_H
#define ARRAY20_H
class Array20
{
public: // 此处为了现实方便将数组变为公共成员。
int array[20];
Array20 operator+(const Array20&);
};
#endif //ARRAY20_H
// Array20.cpp
#include "Array20.h"
Array20 Array20::operator+(const Array20 & a)
{
Array20 sum;
for (int i = 0; i < 20; ++i) {
sum.array[i] = array[i] + a.array[i];
}
}
// 函数调用
Array20 a,b;
// 假设初始化
Array c = a + b;
重载限制
多数C++运算符都可以被重载,重载的运算不必一定是成员函数(特殊运算符号除外),但至少有一个为用户自定义类型。
- 重载运算符必须有一个是用户定义的类型,这是防止用户为标准类型类型重载运算符
- 使用运算符时不能违反原来的语法规则,该有几个操作数就要重载几个操作数
- 不能修改运算符的优先级,在没有括号的情况下,运算符优先级不变。
- 不允许用户定义新的运算符
- 不能重载以下运算符
见菜鸟教程-C+±重载运算符
https://www.runoob.com/cplusplus/cpp-overloading.html
还有 typeid
const_cast
dynamic_cast
reinterpret_cast
static_cast
除了上述强制的规定外,在重载运算符应该遵守明智的限制,例如不把两个时间类的加法运算符定义为一个赋值为另外一个。另外运算符虽然简单易用,但是相较于函数他缺少了函数名这一重要信息,没有办法表明他完成的工作,所以最好能够定义一个有说明性的方法