|
我最近看了一本书,上面解释了运算符重载的要点以及用法注意事项,如下:
◆ 需要在定义的对象间相互赋值时,重载赋值运算符.
◆ 需要为数值类型增加算术属性时,重载算术运算符.
◆ 需要对定义的对象进行逻辑比较时,重载关系运算符.
◆ 如果重载了算术或关系运算符,应该考虑到算术运算和逻辑运算的可交换性(例如,按照重载的运算符计算,有A+B=C,那么务必包括其他运算符,使得B+A=C,C-B=A等等.同样如果有A>B,就要有B<A 和A!=B等等.)
◆ 对于容器类(container)类,重载下标运算符[ ].
◆ 需要从I/O流中读写对象时,重载插入运算符(<<)和析取运算符(>>).
◆ 重载成员指针运算符(->)以实现所谓的smart指针
◆ 在少数特殊的情况下,重载new和delete运算符.
◆ 不要重载其他的任何运算符.
重载的规则:
⒈ 重载的运算符不能违反语言的语言规则.例如,在C++里,下面的语句是不合法的:
int a;
/ a; //错误: / 不是一个单目运算符
因此,不能像下面这样重载/运算符:
Date dt(1,2,83);
/ dt; //错误: / 不是一个单目运算符
⒉ 如果一个运算符可以放在两个标识符中间,就可以重载他来满足累操作的需要,哪怕这种用法原先为编译器所不能接受.
让我们考虑如下的语句:
cout<<"Hello";
如果没有重载<<运算符,表达式的意思是把 std::cout按位左移有字符串的指针给出的位数,显然这无法通过编译器的语法检查.但是这个语句本身是正确的,在某种情况下可以用<<运算符把两个标识符分开.因为为满足这种需要,可以写一个重载运算符函数.当编译器看见重载的运算符出现在与之相关的两个数据类型之间时,就会调用重载的运算符函数.
⒊ 不能重载用与C++内部数据类型的运算符.例如,不能重载双目整数加法运算.
⒋ 不能自己创造C++语言不存在的运算符.例如,美元符号$不是C++中的运算符.因此就不可以用来重载.
⒌ 下列运算符是不可以被重载的:
◆ . 类成员运算符
◆ .* 成员指针运算符
◆ :: 域解析运算符
◆ ?: 条件表达式运算符
⒍ 不可以改变运算符的优先级.
写上面的这些是因为觉得解决了我对重载运算符的大部分疑惑,所以供大家一起分享,一起进步. |
|