并非所有运算符都能重载
可以重载的运算符
不能重载的运算符
不能改变 C++内部数据类型(如 int,float 等)的运算符
格式
函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。
Box operator+(const Box&);
对象作为参数进行传递
// 编写一个复数类模板Complex,其数据成员real和image的类型未知,定义相应
// 的成员函数,包括构造函数、返回实部的函数、返回虚部的函数、重载加法运
// 算符、重载减法运算符以及重载输出运算符。
// 温馨小帖示:参考“相关知识”中的“示例程序”。
#include <iostream> // 编译预处理命令
using namespace std; // 使用命名空间std
// 声明复数类模板
template <class T>
class Complex
{
private:
T real; // 实部
T image; // 虚部
public:
// 公有函数
Complex(T r = 0, T i = 0): real(r), image(i){ }// 构造函数
T GetReal() const { return real; } // 返回实部
T GetImage() const { return image; } // 返回虚部
Complex<T> operator-(const Complex<T> &z2);
Complex<T> operator+(const Complex<T> &z2);
};
// 输出运算符重载函数(非成员函数)
template <class T>
ostream &operator<<(ostream &out, const Complex<T> &z)// 重载运算符<<
{
// 温馨小贴士:
// (1)本运算符重载函数要求输出运算符“<<”,输出格式为“实部+虚部i”,例如:2+3i, 2-3i, -2+3i, 8, -8, 8i, -5i, 0
// (2)在输出完复数后不用加换行符
// (3)z的实部应写为“z.GetReal()”,z的虚部应写为“z.GetImage()”
// (4)在本函数体代码中,输出流对象不应cout,而应是形参out,例如“cout << 0;”应改为“out << 0;”
if (z.GetReal() != 0)
{
if (z.GetImage() < 0) out << z.GetReal() << z.GetImage() << "i";//虚部为负,例如2-5i
else if (z.GetImage() == 0) out << z.GetReal(); // 虚部为0,例如3
else out << z.GetReal() << "+" << z.GetImage() << "i"; // 虚部为正,例如2+5i
}
else
{
if (z.GetImage() == 0) out << 0; // 虚部为0,例如0
else out << z.GetImage() << "i"; // 虚部非0, 例如5i, -8i
}
return out; // 返回输出流对象
}
// 加法运算符重载函数(成员函数)
template <class T>
Complex<T> Complex<T>::operator+(const Complex<T> &z2)
{
return Complex(this->real+z2.GetReal(),this->image+z2.GetImage());
// 减法运算符重载函数
template <class T>
Complex<T> Complex<T>::operator-(const Complex<T> &z2)
{
return Complex(this->real-z2.GetReal(),this->image-z2.GetImage());
}