C++ 运算符重载

将常用的运算符作用于自定义的类,实现需要的功能。

示例:addr 是坐标,重载两个坐标的加法运算。

class addr { public: int x,y ; } ;

addr operator+ ( addr & a1, addr & a2 )

{

    addr result;

    result.x = a1.x + a2.x;

    result.y = a1.y + a2.y;

    return result;

}

addr a,b,c ;

c = a + b;

c = operator+(a,b);

重载规则

N 描述
1 一般对自定义的类进行运算符重载
2 只能使用已有定义的运算符,不能创作新的运算符
3 不是所有运算符都可重载
4 保持运算符的目数(参数个数),“++ -- ()例外”
5 保持运算符的优先级
6 保持运算符的左右结合特性
7 不能改变运算符对基本数据类型的操作方式

重载常识

N 描述
1 重载 ++、-- 时需要改变原值,应“引用”
2 重载单目 - 时,不应改变原值,应“传值”
3 重载函数一般仍返回类型值,这样适用于连续运算

重载函数定义位置

描述 单目参数 双目参数
在类外部定义时,一般作为自定义类的友元,否则只能访问公共成员 1个 2个
在类内部定义时,则为类成员,本类实例作为一个参数(双目为左参数) 0 1个

调用形式

习惯形式 友元运算符函数调用形式 成员运算符函数调用形式
a+b operator+(a,b) a.operator+(b)
-a operator-(a) a.operator-()
a++ operator++(a,0) a.operator++(0)

重载方式的建议

成员函数 友元函数
单目运算

+= -= /= *= &= != ~= %= >>= <<=

= () [] ->

其他

自增减运算符重载的前、后缀识别

运算符 成员定义 友元定义
++oj ob.operator++() operator++(cls & ob)
ob++ ob.operator++(int) operator++(cls & ob,int)
X[Y] type operator[](type)
X(Y) type operator()(type list)

不可“友元”重载的运算符

标识符 描述
=  
()  
[]  
->  

不可重载的运算符

标识符 描述
. 类属关系运算符
* 成员指针运算符
:: 作用域分辨符
sizeof 尺寸
?: 三目运算符