预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共19页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第12章运算符(operator)重载1.什么是运算符重载 回答是否定的! 事实上,C++预定义的+、-、*、/、>、>=、<、<=、==、!=等一系列运算符的操作对象只能是基本数据类型,要让它们在用户自定义的数据类型(如:类)中也能类似使用,就需要对运算符赋予多种含义,这就是运算符重载。 要理解运算符重载的含义,需要把握其中的“变”与“不变”: 运算符不变,重载只能考虑C++现有的运算符,不允许用户定义新的运算符; 操作数的范围有了变化,不再局限于基本数据类型,可以扩展到用户自定义的类型(即用户定义的类),所实现的功能也可以由用户来定义; 运算符的使用形式不变,这样用户就能充分利用已有的知识、经验,见“符”猜义,节省了学习时间,提高了工作效率。 对此,我们形象地称之为“旧瓶装新酒”。2.运算符重载的基本方法 计算表达式9/2、9.0/2.0分别被解释为调用函数:operator/(9,2)、operator/(9.0,2.0)。 而operator/(int,int)和 operator/(double,double)两个函数是重载关系:函数名相同,参数类型不同,功能也不同,故两个表达式的计算结果不同。 事实上,C++中的每一个运算符都对应着一个或多个运算符函数,具体调用时,系统会根据实参的不同选择相应函数进行匹配。 如果用户想让某一个运算符也能在自己定义的类对象中使用,并实现一定的功能,且不影响该运算符原先的使用,就必须对它的运算符函数进行重载。(2)运算符函数重载的基本形式3.运算符重载的一般规则C++允许重载的运算符:(续) 赋值运算符:=、+=、-=、*=、/=、%=、|=、&=、^=、<<=、>>= 空间申请与释放运算符:new、delete、new[]、delete[] 其它运算符:()(函数调用)、->(成员访问)、->*(成员指针访问)、,(逗号)、[](下标) 不能重载的运算符只有5个: .(成员访问运算符).*(成员指针访问运算符) ::(域运算符) sizeof(长度运算符) ?:(条件运算符)重载不能改变运算符操作数的个数、优先级和结合性; 重载运算符的函数不能有默认的参数; 重载运算符必须和用户自定义类型的对象一起使用,其参数至少有一个是类对象或对象引用; 应当使重载运算符的功能类似于该运算符作用于标准数据类型时所实现的功能; 对于运算符:=(对象赋值)和&(取对象地址)的功能,系统已有默认定义,通常情况用户不需要重新定义。只有当对象间赋值涉及动态分配的指针,有可能出现多个对象的指针指向同一位置时,用户才需要自己重新定义。4.用成员函数重载运算符(3)运算符函数(即成员函数)的调用形式:说明:(续) 如果重载的运算符函数允许有参数,那么对该参数的类型并没有严格限定,既可以是自定义类型,也可以是基本数据类型。函数返回值类型的确定也是类似的; 运算符函数的调用方式有两种,一种是普通成员函数的调用方式,另一种是表达式的形式,但后一种方式更直观,更常用; 为了能在类外使用运算符表达式,通常把运算符函数设为public权限; =、()、[]、->等运算符只能用成员函数重载。 设a+bi和c+di是两个复数,则它们的四则运规则如下:5.用友元函数重载运算符友元函数声明、定义、调用格式如下:(3)运算符函数(即友元函数)调用的基本形式:说明:(续)本讲小结