第14章 重载操作符与转换(1)
14.1 重载操作符的定义
重载操作符是具有特殊名称的函数:保留字operator后接需定义的操作符符号。像任何其他函数一样,重载操作符具有返回类型和形参表。
除了函数调用操作符之外,重载操作符的形参数目(包括成员函数的隐式this指针)与操作符的操作数目相同。函数调用操作符可以接受任意数目的操作数。
2. 重载操作符必须具有一个类类型操作数
用于内置类型的操作符,其含义不能改变。
也不能为任何内置类型定义额外的新的操作符。
重载操作符必须具有至少一个类类型或枚举类型的操作数。这条规则强制重载操作符不能重新定义内置类型对象的操作符的含义。
3. 优先级和结合性是固定的
操作符的优先级、结合性或操作数数目不能改变。
除了函数调用操作符operator()之外,重载操作符时使用默认实参是非法的。
4. 不再具备短路求值特性
5. 大多数重载操作符可以定义为普通非成员函数或类的成员函数。
作为类成员的重载函数,其形参看起来比操作数数目少1.作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数。
一般将算术和关系操作符定义为非成员函数,而将赋值操作符定义为成员。
6. 操作符重载和友元关系
操作符定义为非成员函数时,通常必须将它们设置为所操作类的友元。在这种情况下,操作符通常需要访问类的私有部分。
7. 使用重载操作符
可以像调用普通函数一样调用重载操作符函数,指定函数并传递适当类型适当数目的形参。
重载操作符的设计
1. 不要重载具有内置含义的操作符
赋值操作符、取地址操作符和逗号操作符对类类型操作数有默认含义。如果没有特定重载版本,编译器就自己定义这些操作符。
通过为给定类类型的操作数重定义操作符,可以改变这些操作符的含义。
2. 大多数操作符对类对象没有意义
除非提供了重载定义,复制、取地址和逗号操作符对于类类型操作数没有意义。设计类的时候,应该确定要支持那些操作符。
为类设计操作符,最好的方式是首先设计类的公共接口。定义了接口之后,就可以考虑应将那些操作符定义为重载操作符。那些逻辑上可以映射到某个操作符的操作可以考虑作为候选的重载操作符。
3. 复合赋值操作符
当一个重载操作符的含义不明显时,给操作取一个名字更好。对于很少用的操作,使用命名函数通常也比操作符更好。如果不是普通操作,没有必要为简洁而使用操作符。
4. 相等和关系操作符
将要用作关联容器键类型的类应定义<操作符。关联容器默认使用键类型的<操作符。即使该类型将只存储在顺序容器中,类通常也应该定义相等(==)操作符和小于(<)操作符,理由是许多算法假定这些操作符存在。例如sort算法使用<操作符,而find算法使用==操作符。
如果类定义类相等操作符,它也应该定义不等操作符!=。如果类定义了<,则它可能应该定义全部的四个关系操作符(>,>=,<,<=)。
5. 选择成员或非成员实现
赋值(=),下标([]),调用(())和成员访问箭头(->)等操作必须定义为成员,将这些操作定义为非成员函数将在编译时标记为错误。
像赋值一样,复合赋值操作通常应定义为类的成员。与赋值不同的是,不一定非得这样做,如果定义非成员复合赋值操作符,不会出现编译错误。
改变对象状态或与给定类型紧密联系的其他一些操作符,如自增、自减和解引用,通常应定义为类成员。
对称的操作符最好定义为普通非成员函数。
摘自 xufei96的专栏
补充:软件开发 , C++ ,