c++ 重载操作符

重载操作符是具有特殊名称的函数,函数名称由关键字operator后接操作符符号。

Sales_item operator+(const Sales_item& lhs, const Sales_item& rhs);

绝大多数操作符都可以重载,不能重载的操作符包括:“::”、 “.*”、 “.”、 “?:”。

重载操作符必须具有一个类类型(或枚举类型)的操作数,这条规则强制了重载操作符不能重新定义用于内置类型的操作符的含义。

重载操作符时,操作符的优先级、结合性、操作数数目不能变。

“+、-、*、&”四个符号既可以是一元操作符,也可以是二元操作符。究竟重载的是哪个,由重载操作符的操作数数据确定。

除“函数调用操作符operator()”之外,重载操作符时不允许使用默认实参。

 “&&”和“||”和“,”具有较为特殊的行为特性,重载会改变运算符的这些特性,进而影响原有的使用习惯,所以不要重载这三个操作符。

大多数重载操作符可以定义为普通非成员函数,也可以定义为类的成员函数。作为类的成员函数时,形参数少1(由隐含的this形参代表第一个操作数)。

操作符定义为非成员函数时,通常需要将它们设置为所操作类的友元,因为操作符通常需要访问类的私有成员。

使用重载操作符时,既可以:

item1 + item2;

也可以

operator+(item1, item2);
item1.operator+(item2);

在重载操作符时,首先要确定重载哪些操作符对该类类型的操作数有意义。比如“&(取地址)”、“,(逗号操作符)”通常没有必要重载。

如果一个类重载了算术操作符或位操作符,最好也重载相应的复合赋值操作符。例如重载“+”,也应该重载“+=”。

如果类的对象要存储到关联容器中,则类必须重载“<”操作符。如果要存储到顺序容器中,通常也应该重载“<”和“==”,因为许多算法函数假定这些操作符存在,比如sort使用“<”,find使用“==”。

如果重载了“==”,也应该同时重载“!=”。同样的规则也适用于其它关系操作符。例如重载了“<”,也应该重载其余三个关系操作符“<=、>、>=”。

关于应该将重载操作符函数作为普通非成员函数,还是作为类的成员函数,下面是一些指导原则:

“=(赋值)、[](下标)、()(函数调用)、->”,必须定义为成员函数。定义为非成员函数将出现编译错误。

复合赋值操作符通常也应该定义为成员函数,但不是非必须的。

改变对象状态或与给定类型紧密联系的操作符,如“++(自增)、--(自减)、*(解引用)”,通常应定义为成员函数。

对称的操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为普通非成员函数。

【学习资料】 《c++ primer》

posted on 2013-02-24 20:54  zhuyf87  阅读(473)  评论(0编辑  收藏  举报

导航