双目运算符重载为成员函数:
重载为类成员的运算符函数定义形式:
函数类型 operator 运算符(形参)
{
........
}
参数个数 = 原操作数个数 - 1 (后置++, --除外)
双目运算符重载规则:
如果要重载B为类成员函数,使之能够实现表达式 oprd1 B oprd2, 其中oprd1 为A类对象,则B应被重载为A类的成员函数,形参类型应该是oprd2所属的类型
经过重载后,表达式oprd1 B oprd2相当于 oprd1.operator B(oprd2)
例子:
Complex Complex::operator + (const Compex &c2) const{
return Complex(real + c2.real, imag+c2.imag);//利用带参构造函数
}
//这里是一个重载加法的函数。其中利用了Complex类的带参构造函数,使之实现
单目运算符重载规则
如果要重载U为类成员函数,使之能够实现表达式U oprd, 其中oprd为A类对象,则U应该被重载为A类成员函数,无形参,表达式 U oprd 相当于 oprd.operator U()
后置单目运算符 ++ 和 -- 重载规则
如果要重载++ 或-- 为类成员函数。使之能够实现表达式oprd ++ 或oprd--, 其中oprd为A类对象,则++或==应该被重载为A类的成员函数,且具有一个int类型形参。
经过重载之后,表达式 oprd ++ 相当于 oprd.operator ++(0)
也就是说 后置单目运算符重载比前置单目运算符重载多了一个int类型的形参
运算符重载为非成员函数(类外)
函数的形参代表以此自左至右次序排列的各操作数
重载为非成员函数时: 参数个数= 愿操作个数(后置++, -- 除外)
至少应该有一个自定义类型的参数
后置单目运算符++ 和-- 的重载函数,形参列表中要增加一个int,但是不用写形参名
如果在运算符的重载函数中需要操作某类对象的私有成员,可以将此函数声明为该类的友元
运算符重载为非成员函数的规则:
-双目运算符B重载后:表达式oprd1 B oprd2,等同于operator B(oprd1, oprd2)
-前置单目运算符B重载后,表达式 B oprd, 等同于 operator B(oprd)
-后置单目运算符 ++ 和 -- 重载后,表达式 oprd B, 等同于 operator B(oprd, 0)
例子:重载Complex的加减法和“<<”运算符为非成员函数
#include <iostream>
using namespace std;
class Complex{
public:
Complex(double r = 0.0, double i = 0.0):real(r), imag(i){}
friend Complex operator + (const Complex &c1, const Complex &c2); // 传常引用,既提高了效率又能防止数据丢失
// 因为不是类内函数,所以声明为函数的友元
friend Complex operator - (const Complex &c1, const Complex &c2);
friend ostream &operstor <<(ostream &out, const Complex &c);
private:
double real;
double imag;
}
Complex operator + (const Compex &c1, const Complex &c2) {
return Complex(c1.real + c2.real, c2.imag+c2.imag);
}
Complex operator + (const Compex &c1, const Complex &c2) {
return Complex(c1.real - c2.real, c2.imag - c2.imag);
}
ostream & operator <<(ostream &out, const Complex &c){ // 左操作数是std::ostream引用,右操作数为复数类的常引用
// 返回std::ostream引用,用以支持下面形式的输出:
// cout<< a << b; 该输出调用的是: operator << (operator << (cout,a),b)
out << "(" << c.real <<"," <<c.imag <<")";
return out;
}