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

第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


相关文章:
4运算符重载复习题2
4运算符重载复习题2_数学_高中教育_教育专区。运算符重载复习题 2 1、 下列运算符中, ( )运算符在 C++中不能重载。 A = B () C :: D delete 2、 ...
第十章 运算符重载 复习题
的可交换性, 必须将其重载为成员函数, 重载的函 数名是关键字 加上运算符“...(3,4);p3(5,6); cout<<”p1==p2? ”<<(p1==p2)<<endl; cout<<...
第4章 运算符重载
第4运算符重载 4.1 什么是运算符重载所谓重载,就是重新赋予新的含义。...也就是,运算符重载是通过定义函数实现的。 运算符重载实质上是函数的重载。 ...
实验12 运算符重载
3)重载赋值运算符=,将一个多项式赋给另外一个多项式; 4)重载乘法算符*,将两...上第二个时间"<<b<<"得到的时间是:"<<c<<endl; c=a-b; cout<<"第...
c++ 第4课 运算符重载
c++ 第4课 运算符重载_理学_高等教育_教育专区。c++ 第4课 运算符重载 - 刘东明...49页 2下载券 第4讲 运算符重载(上) 暂无评价 13页 1下载券©...
运算符重载练习题1
4.在 c++中,运算符重载有两种实现方法,一种是通过成员函数来实现,另一种则...(int days):返回某日期加上天数得到的日期 Date operator~(int days):返回某...
c++运算符重载习题
定义一个复数类 Complex,重载运算符“+” ,使之能用于复数的加法运算。 将...“+”实现两个矩 Task8-4 /* 4. 在第三题的基础上,重载运算符>>和<<,...
基础概念练习题-第4章
基础概念练习题-第4章_电脑基础知识_IT/计算机_专业资料。运算符重载基础概念练习题 1、下列关于运算符重载的描述中, 正确的是( )。 A 运算符重载可以改变运算...
c++ 基于时间类的运算符重载实验
4:我们来看“>=”这个运算符重载。它在 Cpp 文件里定义如下: 相比“=” ...5:我们来看“<”这个运算符重载。它在 Cpp 文件里定义如下: 由上可知,因为...
《面向对象程序设计》第05章
《面向对象程序设计》第05章_理学_高等教育_教育专区...4、如果表达式 a++中的“++”是作为普通函数重载...正确 错误 2、对每个可重载运算符来讲,它既可以...
更多相关标签: