在上一篇文章中,我介绍了运算符重载的特点,这篇就说说运算符重载的实现
重载为类的成员函数
将运算符重载为它将要操作的类的成员函数,成为成员运算符函数。实际使用时,总是通过该类的某个对象访问重载的运算符。一般是类内声明,类外定义。其一般形式为:
// 类内声明
<返回类型> operator<运算符>(参数表);
// 类外定义
<返回类型> <类名>::operator<运算符>(参数表)
{
/* code */
}
双目运算符重载为成员函数
左操作数是访问该工作运算符的对象本身的数据,由this指针指出,(this指针请见我的另一篇博文)右操作数通过成员运算符的参数指出。因此,此时成员运算符函数只有一个参数,如:
class example
{
// code
example operator+(example obj); // 类内声明
}
example example::operator+(example obj)
{
/* code */ // 类外实现
}
单目运算符重载为成员函数
单目运算符重载为成员函数时,操作数是访问该重载函数的对象本身的数据,由this指针指出。所以,此时成员运算符函数没有参数,如:
class example
{
example operator++( ); // 声明
}
重载为类的友元函数
友元运算符函数(同样类内声明,类外定义)不是类的成员,不属于任何一个对象,故没有this指针,也不需要作用域运算符。因此,重载双目运算符要有两个参数,重载单目运算符要有一个参数,其一般形式为:
friend<返回类型> operator<运算符>(参数表);
friend<返回类型> operator<运算符>(参数表)
{
/* code */
}
提醒:
- = ,(),[ ], -> 不能用友元函数 重载
- 重载++, --时要采用引用来传参
- 运算符的左操作数是一个标准数据类型而右操作数是对象的话,必须是友元函数重载,原因是标准数据类型不能产生对重载运算符的调用
- 运算符的操作数,特别是左操作数要类型转换,必须是友元函数重载
- 若一个运算符要修改对象的状态,成员运算符较好
- <<,>>(输入输出运算符)必须用友元函数重载
一些特殊运算符的重载