C++Primer Plus 第十一章-运算符重载
1)要重载运算符,需要使用被称为运算符函数的特殊函数形式。运算符函数的格式如下:
operatorop( argument - list)
operator + ()重载+运算符,operator*()重载*运算符。op必须是有效的C++运算符,不能虚构一个新的符号。
2)total = coding.operator+(fixing);在运算符表示法中,运算符左侧的对象(这里是coding)是调用对象,运算符右侧的对象(这里是fixing)是作为参数被传递的对象。
3)重载限制:重载后的运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载运算符。
使用运算符时不能违反运算符原来的句法规则。
不能修改运算符的优先级。
不能创建新运算符。
4)不能重载下面的运算符:
sizeof运算符;
. 成员运算符;
. * 成员指针运算符;
:: 作用域解析运算符;
?: 条件运算符;
typeid 一个RTTI运算符;
const _cast 强制类型转换运算符;
dynamic_cast 强制类型转换运算符;
reinterpret_cast 强制类型转换运算符;
static_cast 强制类型转换运算符;
5)大多数运算符都可以通过成员或非成员函数进行重载,但下面的运算符只能通过成员函数进行重载:
= 赋值运算符;
() 函数调用运算符;
[] 下标运算符;
-> 通过指针访问类成员的运算符;
6)t1, t2 , t3, t4都是Time对象
t4 = t1 + t2 + t3 + t4;
对象相加,函数重载之后为:
t4 = t1.operator + (t2 + t3);
t4 = t1.operator + (t2.operator + t3);
7)详细运算符重载的例子请看书本第390页。
8)友元函数:
创建友元函数的第一步是将其原型放在类声明中,并在原型声明前加上关键字friend;
friend Time operator *(double m, const Time & t);
虽然operator*()函数是在类声明中声明的,但它不是成员函数,因此不能使用成员函数运算符来调用它。
虽然operator*()函数不是成员函数,但它与成员函数的访问权限相同。
第二步是编写函数定义。因为它不是成员函数,所以不要使用Time::限定符。不要在定义中使用friend。
Time operator *(double m, const Time &t)
{... ...}
9)只有类声明可以决定哪一个函数是友元,因此类声明仍然控制了哪些函数可以访问私有数据。总之,类方法和友元只是表达类接口的两种不同机制。
10)关键字friend:只有在类声明中的原型中才能使用friend关键字,除非函数定义也是原型,否则不能在函数定义中使用该关键字。
11)重载运算符:作为成员函数还是非成员函数?
可以选择使用成员函数或非成员函数来实现运算符重载。一般来说,非成员函数应是友元函数,这样它才能直接访问类的私有数据。
friend Time operator+(const Time & T1, const Time & T2);
T1 = T2 + T3;
转换为以下两种的任意一个:
T1 = T2.operator+(T3); //成员函数,运用了成员函数运算符.
T1 = operator+(T2, T3); //非成员函数