C++官方参考链接:Classes (II) - C++ Tutorials (cplusplus.com)
类(II)
重载操作符
类本质上定义了C++代码中要使用的新类型。C++中的类型不仅通过构造和赋值的方式与代码交互。它们还通过操作符进行交互。例如,对基本类型执行以下操作:
int a, b, c;
a = b + c;
在这里,基本类型(int)的不同变量分别应用加法操作符和赋值操作符。对于基本算术类型,此类操作的含义通常是明显和明确的,但对于某些类类型则可能不是这样。例如:
struct myclass {
string product;
float price;
} a, b, c;
a = b + c;
在这里,对b和c的+操作的结果并不明显。事实上,这段代码本身就会导致编译错误,因为类型myclass没有为+定义的行为。然而,C++允许大多数操作符被重载,因此几乎可以为任何类型(包括类)定义它们的行为。下面是所有可以重载的操作符的列表:
| Overloadable operators(可重载的操作符) |
|---|
|
操作符通过operator函数重载,这些函数是具有特殊名称的普通函数:它们的名称以operator关键字开头,后面跟着重载的操作符符号。它的语法是:
type operator sign (parameters) { /*... body ...*/ }
例如,笛卡儿向量是两个坐标的集合:x和y。两个笛卡儿向量的加法操作被定义为两个x坐标相加,两个y坐标相加。例如,将笛卡尔向量(3,1)和(1,2)相加得到(3+1,1+2)=(4,3)。这可以在C++中通过以下代码实现:
// overloading operators example
#include
using namespace std;
class CVector {
public:
int x,y;
CVector () {};
CVector (int a,int b) : x(a), y(b) {}
CVector operator + (const CVector&);
};
CVector CVector::operator+ (const CVector& param) {
CVector temp;
temp.x = x + param.x;
temp.y = y + param.y;
return temp;
}
int main () {
CVector foo (3,1);
CVector bar (1,2);
CVector result;
result = foo + bar;
cout << result.x << ',' << result.y << '\n';
return 0;
}

如果对CVector的这么多出现感到困惑,请考虑其中一些引用了类名(即类型)CVector,而其他一些是具有该名称的函数(即构造函数,必须与类具有相同的名称)。例如:
CVector (int, int) : x(a), y(b) {} // function name CVector (constructor)
CVector operator+ (const CVector&); // function that returns a CVector
CVector类的函数operator+重载该类型的加法操作符(+)。一旦声明了,这个函数可以使用操作符隐式调用,也可以使用函数名显式调用:
c = a + b;
c = a.operator+ (b);