Table of Contents
11.1 操作符重载
- 函数重载(function overloading)或函数多态(functional polymorphism),使用户能够定义多个名称相同但特征标(参数列表)不同的函数,旨在能够用相同的函数来完成相同的基本操作。
- 操作符函数 operator op(argument-list)。
11.2 计算时间:一个操作符重载范例
11.2.1 添加加法操作符
- 不要返回指向局部变量或临时对象的引用。函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据。
- total = coding.operator + (fixing) //function notation 函数表示法。total = coding + fixing // operator notation 操作符表示法。 这两种表示法都将调用operator+()方法。注意,在操作符表示法中,操作符左侧的对象是调用对象,操作符右边的对象是作为参数被传递的对象。
11.2.2 重载限制
- 重载后的操作符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重构操作符。
- 使用操作符时不能违反操作符原来的句法规则,不能将求模操作符重载为使用一个操作数。同样,不能修改操作符的优先级。因此,如果将加号操作符重载成将两个类相加,则新的操作符与原来的加号具有相同的优先级。
- 不能定义新的操作符。
- 不能重载的操作符。
- 可被重载的操作符。
- 大多数操作符都可以通过成员或非成员函数进行重载,但下面的操作符只能通过成员函数进行重载:赋值操作符,函数调用操作符,下标操作符,通过指针访问类成员的操作符。
11.2.3 其他重载操作符
11.3 友元简介
11.3.1 创建友元
- 友元有三种:友元函数。友元类。友元成员函数。
- 通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。
- 使用非成员函数可以按所需的顺序获得操作数,但引发了一个新问题,非成员函数不能直接访问类的私有数据,至少常规非成员函数不能访问。但是,有一类特殊的非成员函数可以访问类的私有成员,它们被称为友元函数。
- 创建友元函数的第一步是将其原型放在类声明中,并在原型声明前加上关键字friend: friend Time operator * (double m, const Time & t); 第二步是编写函数定义,不要使用::限定符,不要在定义中使用关键字friend
- 类的友元函数是非成员函数,其访问权限与成员函数相同。
- 只有类声明可以决定哪一个函数是友元,因此类声明仍然控制了哪些函数可以访问私有数据。简而言之,类方法和友元只是表达类接口的两种不同机制。
- 如果要为类重载操作符,而将非类的项作为第一个操作数,则可以用友元函数来反转操作数的顺序。
11.3.2 常见的友元:重载<<操作符
- 类继承属性让ostream引用能够指向ostream对象和ofstream对象。
11.4 重载操作符:作为成员函数还是非成员函数
- 对于成员函数版本来说,一个操作符需要this指针隐式地传递,另一个操作数作为函数参数显式地传递;对于友元版本来说,两个操作数都作为参数来传递。
- 非成员版本的重载操作符函数所需的形参数目与操作数数目相同;而成员版本所需的参数数目少一个,因为其中的一个操作数是被隐式地传递的调用对象。
11.5 再谈重载:矢量类
11.5.1 使用状态成员
- 类非常适于在一个对象中表示实体的不同方面。
11.5.2 为Vector类重载算术操作符
- 如果方法通过计算得到一个新的类对象,则应考虑是否可以使用类构造函数来完成这种工作。这样做不仅可以避免麻烦,而且可以确保新的对象是按照正确的方式创建的。
- 因为操作符重载是通过函数来实现的,所以只要操作符函数的特征标不同,使用的操作符数量与相应的内置c++操作符相同,就可以多次重载同一个操作符。
11.5.3 对实现的说明
11.5.4 使用Vector类来模拟随机行走
11.6 类的自动转换和强制类型转换
11.6.1 程序说明
- C++语言不自动转换不兼容的类型。