11.1 运算符重载
- 运算符函数的格式:operatorop(argument-list) 例如operator+() 重载+运算符,operator*() 重载*运算符。op必须是有效的C++运算符,不能虚构一个新的符号
11.2 计算时间:一个运算符重载示例
- 不要返回指向局部变量或临时对象的引用。函数执行完毕后, 局部变量和临时变量都将消失,引用将指向不存在的数据
重载限制
- 重载后的运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载运算符
- 使用运算符时不能违反运算符原来的句法规则,同样不能修改运算符的优先级
- 不能创建新运算符
- 不能重载下面的运算符 sizeof/typeid/?😕.*等
- 大多数运算符都可以通过成员或非成员函数进行重载,但下面的运算符只能通过成员函数进行重载 =:/()/[]/->
11.3 友元
C++控制对类对象私有部分的访问,但有时候限制太严格,以致于不适合特定的编程问题,这种情况下,C++提供了另外一种形式的访问权限:友元,包括友元类/友元函数/友元成员函数,通过让函数称为类的友元,可以赋予该函数与类的成员函数相同的访问权限
友元函数
- 将其原型放在类声明中,并在原型声明前加上关键字friend
friend Time operator*(double m, const Time & t)
operator是类声明中声明的,但它不是成员函数,因此不能使用成员运算符来调用
operator不是成员函数,但它与成员函数的访问权限相同 - 编写函数定义,因为它不是成员函数,所以不要使用Time::限定符,另外,不要再定义中使用关键字friend
Time operator*(double m, const Time &t)
{
}
总之,类的友元函数是非成员函数,其访问权限与成员函数相同,将友元函数看作是类的扩展接口的组成部分,例如,从概念上看,double乘以Time和Time乘以double是完全相同的。前一个要求有友元函数,后一个使用成员函数,这是C++语句的结果,而不是概念上的差别。通过使用友元函数和类方法,可以用同一个用户接口表达这两种操作
11.4 重载运算符
- 对于某些运算符来说,成员函数是唯一合法的选择,在其他情况下,两种格式没有太大的区别,有时,根据类设计,使用非成员函数版本可能更好
11.6 类的自动转换和强制类型转换
转换函数
- 转换函数必须是类方法
- 转换函数不能指定返回类型
- 转换函数不能有参数