全部博文(346)
分类: C/C++
2008-09-02 13:07:08
C++主题——重载操作符
1. 重载操作符后,操作符的含义不应该被改变。
2. 重载操作符后,优先级和结合性不变。
3. 重载操作符,应注意如果原操作符是一目操作符,那么重载后仍应该是一目的,以此类推,特别注意:冲在操作符时使用默认实参是非法的。
4. 短路操作符被重载后不再具备短路性。
5. 对于选择友元、成员、非成员的形式,需要在重载前衡量习惯、效率等问题。
成员形式:
1)=、[ ]、()、->应定义为一个成员形式
2)+=、-=等复合赋值操作符,通常定义成成员形式
3)对那些改变类型的数据成员的状态的操作符,如++、--一般也定义为成员形式
非成员形式:
4)对称操作符、如相等、关系、位操作符,定义为非成员函数。
5)io操作必须为非成员。
6)一般将算术操作符定义为非成员形式。
6. 重载operator + 和 operator +=时,若将其作为成员形式重载,那么返回类型为T&类型、返回值为*this比较好,可以做连续加法,也可提高效率。
7. 默认情况下,对于类对象,复制操作符表示按位copy,取地址操作符返回对象的值,逗号操作符返回最右边的操作数的值。
8. 逻辑判断操作符在容器中应用比较广,所以如果想将类型放在容器中,又进行类似sort等需要判断逻辑大小关心的操作,应该重载大/小操作符。
9. 对于重载<<操作符有比较一致的要求:
ostream& operator << (ostream& os, const classtype &object){return os;}
第一个形参是对ostream对象的引用,在该对象上产生输出。它不能使const因为写入输出流会改变流状态。它必须是一个引用,因为不能复制流。
返回值是ostream的引用,它的值通常是输出操作符的ostream的对象。
10. 对于重载>>操作符有比较一致的要求:
istream& operator>>(istream& in,const classtype& object)
{return in}
需要注意的是,输入操作符必须处理错误和文件结束的可能性。
11. 算术操作符通常产生一个新值,该值是两个参数的计算结果,它不同于任意一个参数。当我们定义了一个符合运算符,又定义了一个算术操作符,则可以通过符合操作符实现算术操作符。
12. 如果定义了相等操作符,那么它应该同时定义不等操作符。同时,应让一个操作符完成比较对象的实际操作,而另一个调用它。
stl中很多容器用到了相等操作符,所以当想把他放入容器中时,应该定义相等操作符。
13. 下标操作符必须为成员函数,而且为确保它在作用到赋值操作的左右两边时都表现正常,应该定义const和非const版本的下标操作符,他们都返回引用。
14. 箭头操作符必须被定义为成员形式。它看起来像二元操作符,但是注意他是一元的,不接受实参。返回值必须是指向类类型的指针。这时会有递归调用箭头操作符的情况,应避免。
15. 解引用可定义为成员形式。同时重载const和非const形式。
16. 自增自减操作符定义成成员形式,前缀型无参数,后缀型有参数int。返回值为对象的引用。前缀形式返回新值,后缀形式返回旧值。需显示调用后缀形式。