1、重载操作符(即运算符重载)是具有特殊名称的函数,保留字operator后接需要定义的操作符符号。
2、除了函数调用操作符之外,重载操作符的形参数目(包括成员函数的隐式this指针)与操作符的操作数目相同。函数调用操作符可以接受任意数目的操作数。
3、不能用过连接其他合法符号来创建任何新的操作符。例如,试图定义一个operator**操作符以提供供求幂操作是非法的。
4、用于内置类型的操作符,其含义不能改变。例如,内置的整型加号操作符不能重定义。“int operator+(int, int);”是不合法的。也不能为任何内置类型定义额外的新的操作符。例如,不能接受定义两个数组类型操作的operator+。
5、重在操作符必须具有至少一个类类型或枚举类型的操作数,这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义。
6、除了函数调用操作符operator()之外,重在操作符时使用默认实参是非法的。
7、在&&和||的重载版本中,两个操作数都要进行求值,而且对操作数的求值顺序不做规定。因此,重载&&、||或逗号操作符不是一种好的做法。
8、重载一元操作符如果作为成员函数就没有(显示)形参,如果作为非成员函数就有一个形参。类似地,重载二元操作符定义为成员时有一个参数,定义为非成员函数时有两个形参。
9、操作符定义为非成员函数时,通常必须将它们设置为所操作类的友元。
10、内置逻辑与(&&)和逻辑或(||)操作符使用短路求值。如果重新定义该操作符,将失去操作符的短路求值特征。
11、重载逗号、取地址、逻辑与、逻辑或、等操作符通常不是好的做法。这些操作符具有有用的内置含义,如果我们定义了自己的版本,就不能再使用这些内置含义。
12、如果类定义了相等操作符,它也应该定义不等操作符!=。类用户会假设如果可以进行相等比较,则也可以进行不相等比较。同样的规则阿应用于其他关系操作符。如果定义了<,则它可能应该定义全部的四个关系操作符(>,>=,<,<=)。
13、下面是一些指导原则,有助于决定将操作设置为类成员还是普通非成员函数:(1)赋值(=)、下标([])、调用(())和成员访问箭头(->)等操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误;(2)像赋值一样,复合赋值操作符通常应定义为类的成员。与赋值不同的是,不一定非得这样做,如果定义非成员复合赋值操作符,不会出现编译错误;(3)改变对象状态或与给定类型紧密联系的其他一些操作符,如自增、自减和解引用,通常应定义为类成员;(4)对称的操作符,如算术操作符、相等操作符、关系操作符和为操作符,最好定义为普通非成员函数。
14、一般而言,输出操作符应输出对象的内容,进行最小限度的格式化,它们不应该输出换行。
15、相等和不相等操作一般应该相互联系起来,让一个操作符完成比较对象的实际工作,而另一操作符只是调用前者。
16、类赋值操作接受类类型形参,通常,该形参是对类类型的const引用,但也可以是类类型的非const引用。如果没有定义这个操作符,则编译器将合成它。类赋值操作符必须是类的成员,以便编译器可以知道是否需要合成一个。
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。