并非所有运算符都能重载
可以重载的运算符
不能重载的运算符

不能改变 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-5ielse if (z.GetImage() == 0) out << z.GetReal(); // 虚部为0,例如3else out << z.GetReal() << "+" << z.GetImage() << "i"; // 虚部为正,例如2+5i}else{if (z.GetImage() == 0) out << 0; // 虚部为0,例如0else 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());}
