《第11章 使用类》

Table of Contents

 

11.1 操作符重载

11.2 计算时间:一个操作符重载范例

11.2.1 添加加法操作符

11.2.2 重载限制

11.2.3 其他重载操作符

11.3 友元简介

11.3.1 创建友元

11.3.2 常见的友元:重载<<操作符

11.4 重载操作符:作为成员函数还是非成员函数

11.5 再谈重载:矢量类

11.5.1 使用状态成员

11.5.2 为Vector类重载算术操作符

11.5.3 对实现的说明

11.5.4 使用Vector类来模拟随机行走

11.6 类的自动转换和强制类型转换

11.6.1 程序说明

11.6.2 转换函数

11.6.3 转换函数和友元函数

11.7 总结


11.1 操作符重载

  1. 函数重载(function overloading)或函数多态(functional polymorphism),使用户能够定义多个名称相同但特征标(参数列表)不同的函数,旨在能够用相同的函数来完成相同的基本操作。
  2. 操作符函数 operator op(argument-list)。

11.2 计算时间:一个操作符重载范例

11.2.1 添加加法操作符

  1. 不要返回指向局部变量或临时对象的引用。函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据。
  2. total = coding.operator + (fixing) //function notation 函数表示法。total = coding + fixing // operator notation 操作符表示法。               这两种表示法都将调用operator+()方法。注意,在操作符表示法中,操作符左侧的对象是调用对象,操作符右边的对象是作为参数被传递的对象。

11.2.2 重载限制

  1. 重载后的操作符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重构操作符。
  2. 使用操作符时不能违反操作符原来的句法规则,不能将求模操作符重载为使用一个操作数。同样,不能修改操作符的优先级。因此,如果将加号操作符重载成将两个类相加,则新的操作符与原来的加号具有相同的优先级。
  3. 不能定义新的操作符。
  4. 不能重载的操作符。
  5. 可被重载的操作符。
  6. 大多数操作符都可以通过成员或非成员函数进行重载,但下面的操作符只能通过成员函数进行重载:赋值操作符,函数调用操作符,下标操作符,通过指针访问类成员的操作符。

11.2.3 其他重载操作符

11.3 友元简介

11.3.1 创建友元

  1. 友元有三种:友元函数。友元类。友元成员函数。
  2. 通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。
  3. 使用非成员函数可以按所需的顺序获得操作数,但引发了一个新问题,非成员函数不能直接访问类的私有数据,至少常规非成员函数不能访问。但是,有一类特殊的非成员函数可以访问类的私有成员,它们被称为友元函数。
  4. 创建友元函数的第一步是将其原型放在类声明中,并在原型声明前加上关键字friend:                                                                           friend Time operator * (double m, const Time & t);                                                                                                                                  第二步是编写函数定义,不要使用::限定符,不要在定义中使用关键字friend
  5. 类的友元函数是非成员函数,其访问权限与成员函数相同。
  6. 只有类声明可以决定哪一个函数是友元,因此类声明仍然控制了哪些函数可以访问私有数据。简而言之,类方法和友元只是表达类接口的两种不同机制。
  7. 如果要为类重载操作符,而将非类的项作为第一个操作数,则可以用友元函数来反转操作数的顺序。

11.3.2 常见的友元:重载<<操作符

  1. 类继承属性让ostream引用能够指向ostream对象和ofstream对象。

11.4 重载操作符:作为成员函数还是非成员函数

  1. 对于成员函数版本来说,一个操作符需要this指针隐式地传递,另一个操作数作为函数参数显式地传递;对于友元版本来说,两个操作数都作为参数来传递。
  2. 非成员版本的重载操作符函数所需的形参数目与操作数数目相同;而成员版本所需的参数数目少一个,因为其中的一个操作数是被隐式地传递的调用对象。

11.5 再谈重载:矢量类

11.5.1 使用状态成员

  1. 类非常适于在一个对象中表示实体的不同方面。

11.5.2 为Vector类重载算术操作符

  1. 如果方法通过计算得到一个新的类对象,则应考虑是否可以使用类构造函数来完成这种工作。这样做不仅可以避免麻烦,而且可以确保新的对象是按照正确的方式创建的。
  2. 因为操作符重载是通过函数来实现的,所以只要操作符函数的特征标不同,使用的操作符数量与相应的内置c++操作符相同,就可以多次重载同一个操作符。

11.5.3 对实现的说明

11.5.4 使用Vector类来模拟随机行走

11.6 类的自动转换和强制类型转换

11.6.1 程序说明

  1. C++语言不自动转换不兼容的类型。

11.6.2 转换函数

11.6.3 转换函数和友元函数

11.7 总结

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值