当前位置:首页 >> 数学 >>

第4讲 运算符重载(上)


第4 讲

运算符重载

4.1 运算符重载概念 4.2 重载运算符的规则 4.3 友元及友元重载函数

1

引言
? ? ? ?

? ? ?

下列哪些表达式是正确的?为什么 int a,b,c; c=a+b; char c1,c2,c3;c3=c1+c2; char c1[4]=“abc”,c2[4]=“cde”,c3[10]; c3=c1+c2; strcpy(c3,c1);strcat(c3,c2); string s1=“abc”,s2=“cde”,s3; s3+s1+s2; struct student st1,st2,st3; st3=st1+st2; class student st1,st2,st3; st3=st1+st2;

? 结论:在C++中的运算符只能对基本数据的进行操作;这 些运算符本质上是由编译器提出的底层函数来实现功能 ? 问题:对对象是否可以使用这些运算符来操作呢?
2

4.1 运算符重载概念
?重载概念:用户根据自己需要对C++已有运算符或函

数的功能重新赋予新的含义,使之“一词多义”
?函数重载:同一函数名可以实现不同的功能 ?运算符重载:同一运算符能实现不同类型数据的运算操作

3

生活中的重载概念
杯 具 一 词 重 载

小故事--中文词汇重载的威力
某天吃饭时一人说去方便一下,日本人不解。旁人告诉他“方 便”就是“上厕所”。敬酒时,一人对日本人说:希望下次去日本 时能给予方便,日本人纳闷不敢问。酒席上,又电视台美女主持 人提出,在她方便时会安排日本人做专访谈谈如啥要霸占钓鱼岛 ?日本人愕然:怎么能在你方便时谈呢?美女主持人说,那在你 方便时,请你谈。日本人晕倒!醒来后,美女主持人又对他说, 要不你我都方便时,再谈。又一次晕倒,再没有醒来。 大家方便 时笑一笑吧

4

4.1 运算符重载概念

c.real=this->real+c2.real

为什么用对象引用,不用行吗?

c.real=c1.real+c2.real

5

4.1 运算符重载概念
? 运算符重载

通过定义一个函数来赋予一个运算符新功能。在需 要执行被重载的运算符时,系统就自动调用该函数, 以实现相应的运算 ? 重载运算符一般格式: 函数类型 operator 运算符名称 (形参表列) {对运算符重载处理的函数体} ? 例,将“+”用于Complex类(复数)的加法运算,函 数的原型为: Complex operator+ (Complex& c1,Complex& c2);
6

Complex complex::operator+(complex &c2) {return complex(real+c2.real,image+c2.image);}

7

4.1 运算符重载概念
小结:
1) 例2中的operator+函数取代了例1中的complex_add函数, 只是函数名不同,函数体和函数返回值类型都是相同
2) main函数中,以“c3=c1+c2;”取代了例1中的 “c3=c1.complex_add(c2);” 编译系统将程序中式c1+c2解 释为c1.operator+(c2) 3)重载意义:c++提供的运算符只能用于标准数据类型的运算 。但可通过重载,用于新的数据类型(类对象) 4)运算符被重载后,其原有的功能仍然保留.根据运算对象来 确定是使用原有还是重载功能
8

4.2运算符重载规则
(1) C++允许重载的运算符

(2)不能重载的运算符 . (成员访问运算符)
.* (成员指针访问运算符) ∷ (域运算符) sizeof (长度运算符) ?: (条件运算符)

9

10

11

4.2运算符重载规则

12

4.2运算符重载规则

13

14

15

4.3 友元及友元重载函数
? 类的成员访问权限

? 问题:类的私有成员如果需要被类外函数或不同类的 对象访问?怎么办?
16

4.3 友元及友元重载函数

17

18

19

4.3 友元及友元重载函数

20

21

4.3 友元及友元重载函数

? 如需对“友元”更多了解,请阅读“C++程序员的婚 礼”

22

运算符重载规则小结
1) 重载不能改变运算符操作数的个数、优先级别、结合性 2)重载运算符的函数不能有默认的参数 3)重载运算符必须和用户定义的自定义类型的对象一起使用, 其参数至少应有一个是类对象(或类对象的引用) 4)用于类对象的运算符必须重载,但有两个例外,运算符 “=”和“&”不必用户重载 5)重载运算符的功能类似于该运算符作用于标准类型数据时所 实现的功能 6)运算符重载函数可以是类的成员函数或类的友元函数 7)友元的关系是单向的而不是双向的;友元的关系不能传递;
23

第4次作业(必做题)
1.完成类中友元函数(申明形式如红线)的定义形式

2.C++在C基础上增加一个新的数据类型—字符串类型 (string),其实本质上它是C++在标准库中申明了一个 字符类。请完成string类申明,并采用类的成员函数重 载==,>,< ,+,= 5种运算符(参考教材5.6节)
24

第4次作业(选做题)
思考如下问题,分析为什么? 1)友元函数是否可以申明在类中的private? 2)类中申明的友元函数是否有this指针? 3)如何使得友元函数获得操作对象? 4)为什么说,使用友元函数破坏了类的封装性,而使用友 元类增强了类的封装性?运用类封装性和友元类的原理 来分析?(提示:通过分析“年轻人结婚后为什么要从父 母家中分离出来另立门户”来参考思考上述问题,不考 虑社会学因素)
?

25


赞助商链接
相关文章:
实验10 运算符重载(2) (1)
4.设计一个日期类 Date,,要求: (1)包含年(year)、月(month)和日(day)私有数据成员。 (2)包含构造函数,重载关于一日期加上天数的加法运算符+、重载关于一...
c++ 第4课 运算符重载
c++ 第4课 运算符重载_理学_高等教育_教育专区。c++ 第4课 运算符重载 - 刘东明...49页 2下载券 第4讲 运算符重载(上) 暂无评价 13页 1下载券©...
运算符重载练习题
4.在 c++中,运算符重载有两种实现方法,一种是通过成员函数来实现,另一种则...本程序输出 2003 年 2 月 10 日加上 365 天后的 日期,结果为:2/10/2004...
运算符重载
运算符重载 - 第4运算符重载 4.1 什么是运算符重载 所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使 之实现新功能。 运算符...
基础概念练习题-第4章
基础概念练习题-第4章_电脑基础知识_IT/计算机_专业资料。运算符重载基础概念练习题 1、下列关于运算符重载的描述中, 正确的是( )。 A 运算符重载可以改变运算...
实验七-运算符重载参考答案
(); CComplex obj4 = ++obj3; cout<<"obj4="; obj4.print(); return 0; } 问题一:以上程序中的三个运算符重载都有错误,试改正过来,使程序输出正确...
4运算符重载复习题1
4运算符重载复习题1_IT/计算机_专业资料。运算符重载复习题 1 1.概念填空题 1.1 运算符重载是对已有的运算符赋予 含义, 使同一个运算符在作用于 对象时导致...
实验9 运算符重载(1)
3)重载赋值运算符=,将一个多项式赋给另外一个多项式; 4)重载乘法算符*,将两个多项式相乘; 5)重载加法赋值运算符+=、减法赋值运算符-=以及乘法赋值运算符*=。...
下列关于运算符重载的描述中,错误的是( )。 A.可以通过...
B.赋值运算符只能重载为成员函数C.运算符函数重载为类的成员函数时,第一操作就是该类对象D.重载类型转换运算符时不需要声明返回类型...
4--运算符重载
运算符重载函数既可以是一个成员函数,也可以是友元函数 C、运算符重载函数只能是一个非成员函数 D、运算符重载函数只能是友元函数 4、下列叙述不正确的是( )。 ...
更多相关标签: