高质量C++编程 2.运算符重载.pdf
文本预览下载声明
高质量C++编程
——运算符重载和转换函数
项目需求
我们的项目中,由于GCPtr 类不但要
能动态申请heap区,还要能申请数组,
并且遍历这个数组、具有边界检查能力。
于是需要具有如此能力的另一个类的协
却仍然
助——Iter 类。 却仍然
却仍然
为了提供如同普通指针一样行为,利
用操作符重载,它定义了包括算术运算
在内的所有指针操作,以协助GCPtr 类。 却仍然
其结构如右图所示:
运算符重载概念
在函数重载的基础上,C++语言还提供了用户重塑运算符的机制。
表现为用函数形式来重新描述运算符的功能。这种基本运算符
和用户定义的函数形式的运算符共存的机制叫运算符重载。
如此一来,使本不具备运算能力的对象也具有了该项能力,能和
基本类型并驾齐驱了。
运算符重载设计的是否必要得当的唯一标准,是看该对象是否如
同一个普通变量一样可用运算符。不是多多益善,而是适可而
止。
注意:重载运算符函数的参数必须至少含有一个类类型操作数,
不可以全是基本类型。
运算符分类
C++中除下列运算符之外的所有运算符可以重载:
. .* :: sizeof typeid ?: static_cast
dynamic_cast const_cast reinterpret_cast
|| , 唯一的一个三目运
这三个运算符是许
算符不能重载。
多教程没有提到的。
可重载运算符:
+ - * / % ^ | ~ ! =
= = ++ -- == != += -= /=
%= ^= = |= *= = = [] () -
-* new new [] delete delete []
运算符重载的形式
重载的运算符函数是为类对象服务的,可以作为类的成员函数,
也可以作为类的友元函数。
1. 重载为类成员函数(要受类成员存取权限约束) ,对象本身就是函
数的调用者,另一个运算对象则作为函数的参数(或者没有)。this
指针即是发起调用的对象。
形参个数是原操作数个数- 1 (后置++、--除外)
这一规则限制了重载函数写成静态函数形式。
2. 重载为友元函数。由于没有this 指针,所以:
形参个数就是原操作数个数。
只能重载C++语言中已有的运算符,
复习:运算符重载的规则: 不可臆造新的;
不改变原运算符的优先级和结合性;
不能改变操作数个数;
不可声明为类属性;
要符合该运算符的使用习惯;
运算符重载的显式和隐含调用
重载的运算符是个函数,于是
显示全部