在 C++ 中,可以通过运算符重载来实现自定义数据类型对运算符的支持。运算符重载的基本思路是,将运算符作为函数名,将操作数作为函数参数,在函数中实现自定义类型的具体运算操作,然后返回结果。使用运算符重载可以使得代码更加简洁且易读,使代码更加便于理解和维护。
运算符重载的语法格式为:
```cpp
返回值类型 operator 运算符符号(参数列表);
```
其中,返回值类型表示运算结果的类型,运算符符号表示要重载的运算符(比如 +、-、*、/ 等),参数列表则表示运算符所涉及到的操作数。
下面以自定义复数类为例,说明如何实现运算符重载。
首先是复数类的定义:
```cpp
class Complex
{
private:
double real;
double imag;
public:
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
Complex operator+(const Complex& c) const;
Complex operator-(const Complex& c) const;
Complex operator*(const Complex& c) const;
Complex operator/(const Complex& c) const;
friend ostream& operator<<(ostream& os, const Complex& c);
friend istream& operator>>(istream& is, Complex& c);
};
```
在上述代码中,定义了一个名为Complex的类,其中包含两个私有成员变量real和imag,代表复数的实部和虚部。并定义了构造函数、四个运算符重载函数和两个友元函数。
下面对运算符重载函数进行详细的说明。
1. 加法运算符重载函数
```cpp
Complex Complex::operator+(const Complex& c) const
{
double r = real + c.real;
double i = imag + c.imag;
return Complex(r, i);
}
```
在上述代码中,实现了复数加法的运算。将两个复数的实部和虚部分别相加,得到结果后生成新的复数对象并返回。
2. 减法运算符重载函数
```cpp
Complex Complex::operator-(const Complex& c) const
{
double r = real - c.real;
double i = imag - c.imag;
return Complex(r, i);
}
```
在上述代码中,实现了复数减法的运算。将两个复数的实部和虚部分别相减,得到结果后生成新的复数对象并返回。
3. 乘法运算符重载函数
```cpp
Complex Complex::operator*(const Complex& c) const
{
double r = real * c.real - imag * c.imag;
double i = real * c.imag + imag * c.real;
return Complex(r, i);
}
```
在上述代码中,实现了复数乘法的运算。根据复数乘法公式,得到结果后生成新的复数对象并返回。
4. 除法运算符重载函数
```cpp
Complex Complex::operator/(const Complex& c) const
{
double d = c.real * c.real + c.imag * c.imag;
double r = (real * c.real + imag * c.imag) / d;
double i = (imag * c.real - real * c.imag) / d;
return Complex(r, i);
}
```
在上述代码中,实现了复数除法的运算。根据复数除法公式,得到结果后生成新的复数对象并返回。
5. 输出运算符重载函数
```cpp
ostream& operator<<(ostream& os, const Complex& c)
{
os << '(' << c.real << ',' << c.imag << ')' << endl;
return os;
}
```
在上述代码中,重载了输出运算符,可以使用cout将复数对象输出到屏幕上。
6. 输入运算符重载函数
```cpp
istream& operator>>(istream& is, Complex& c)
{
is >> c.real >> c