C++Primer Plus 第十一章-运算符重载和友元函数

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);  //非成员函数


你可能感兴趣的:(C++,C语言)