第十四章----重载运算与类型转换
1、重载运算符是特殊的函数,它们的名字由operator和其后要重载的运算符号共同组成。 因为重载运算符时函数, 因此它包含返回值、参数列表和函数体。对于重载运算符是成员函数时, 它的第一个运算对象被隐式的绑定到this指针上,因此,成员函数的重载运算符的显示参数数量比运算符的运算对象少一个。对一个运算符函数来说, 要么它是一个类的成员函数, 或者它的参数至少包含一个类类型。
2、某些运算符不应该被重载:对于逻辑与&&、逻辑或 || 和逗号运算符来说,重载它们会无法保留下来它们的运算对象的求值顺序。 而且对于&& 和 || 来说,它们具有的短路求值属性也无法保留。对于取地址运算符,它又特定的内置含义,它也不该被重载。在C++中只有作用域操作符(::)、条件操作符(?:)不能重载。
3、重载运算符应该和内置类型一样的含义:如果类执行IO操作,则定义移位运算符使其与内置类的IO 一致。一般定义了相等性运算符==,那么也应该定义!= 运算符。一个类定义了一个比较运算符,那么它也应该定义其他比较运算符。重载运算符的返回类型应该和内置版本的返回类型一致。
4、赋值(=)、 下标([])、调用(())和成员访问箭头运算符必须定义为成员函数,
复合赋值运算符一般定义为成员函数,但不是必须的
改变对象状态的运算符或者与给定类型密切相关的运算符,如递增、递减和解引用运算符,一般定义为成员函数具有对称性的运算符可能转换任意一端的运算对象,例如算术、相等性、关系和位运算符等,通常应该为非成员函数。
5、输出运算符的第一个形参是一个非常量的ostream对象的引用,第二个形参一般是一个常量的引用,因为输出运算符不会改变参数的值
6、类型转换操作符重载:
类设计者可以设计类型转换操作符重载,用以将类类型转换为需要转换到的类型,该转换过程为隐式类型转换。编译器只能够从类
类型转换到相应类型一次,如果需要多次转换则只能跟标准库转换,不能连续多次类类型转换,即不能递归转换。标准转换可以放
在类类型转换之前。可以利用类类型转换操作符重载与构造函数实现类类型与内置类型的相互转换。
7.不能重载的运算符有四个, :: .* . ? . ,有一些不应该被重载。重载运算符主要为类准备的。