第十一章 使用类

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 类的自动转换和强制类型转换

转换函数

  • 转换函数必须是类方法
  • 转换函数不能指定返回类型
  • 转换函数不能有参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值