一、 重载运算符的限制:
不能重载的算符
. :: .* ?: sizeof
可以重载的运算符
+ - * / % ^ & | ~
! = < > += -= *= /= %
^= &= |= << >> >>= <<= == !=
<= >= && || ++ -- ->* ‘ ->
[] () new delete new[] delete[]
注:重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:
不改变运算符的优先级
不改变运算符的结合性
不改变运算符所需要的操作数
不能创建新的运算符
二、成员运算符函数的原型在类的内部声明格式如下:
class X {
//…
返回类型 operator运算符(形参表);
//…
}
在类外定义成员运算符函数的格式如下:
返回类型 X::operator运算符(形参表)
{
函数体
}
友元函数和成员函数的使用场合:一般情况下,建议一元运算符使用成员函数,二元运算符使用友元函数
1、运算符的操作需要修改类对象的状态,则使用成员函数。如需要做左值操作数的运算符(如=,+=,++)
2、运算时,有数和对象的混合运算时,必须使用友元
3、二元运算符中,第一个操作数为非对象时,必须使用友元函数。如输入输出运算符<<和>>
注:C++中不能用友元函数重载的运算符有
= () [] ->
成员函数与友元函数的比较:
(1) 成员运算符函数比友元运算符函数少带一个参数(后置的++、--需要增加一个形参)。
(2) 双目运算符一般可以被重载为友元运算符函数或成员运算符函数,但当操作数类型不相同时,必须使用友元函数。
注:1.赋值运算符重载用于对象数据的复制
2.重载函数原型为:
类名 & 类名 :: operator= ( 类名) ;
3.operator=必须重载为成员函数
[]运算符用于访问数据对象的元素
重载格式 类型 类::operator[] ( 类型) ;
例
设 x 是类 X 的一个对象,则表达式
x[ y ]
可被解释为 x . operator [ ] ( y )
()运算符用于函数调用
重载格式 类型 类:: operator() ( 参数表 ) ;
例
设 x是类 X的一个对象,则表达式
x ( arg1, arg2, … )
可被解释为
x . operator () (arg1, arg2, … )
四、重载流插入和流提取运算符
定义输出运算符“<<”重载函数的一般格式如下:
ostream&operator<<(ostream&out,class_name&obj)
{
out<<obj.item1;
out<<obj.item2;
.. .
out<<obj.itemn;
return out;
}
六、心得体会