欢迎来到天天文库
浏览记录
ID:51777167
大小:569.90 KB
页数:55页
时间:2020-03-07
《C++程序设计与实践 教学课件 作者 白忠建chapter07 运算符重载.pptx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C++程序设计与实践第七章运算符重载电子科技大学信息与软件工程学院白忠建第七章运算符重载本章要点运算符重载的原理和使用。通过运算符重载,用户自定义的类类型可以参与标准类型相似的各种的运算。运算符重载的实质是函数重载。常用运算符的重载。其中++和--运算符作为前缀和后缀重载有不同的形式。特殊运算符的重载。为特别目的可以重载流、类类型转换、指针、()和[]运算符。7.1问题引入高级程序设计语言的一种突出的能力就是能够让用户自定义抽象数据类型。同时,还允许用户在自定义类型上定义运算,其中包括赋予语言内
2、建运算新的含义。这扩展了高级程序设计语言的功能,使其能处理更加复杂的问题。7.1问题引入然而一个横在程序员面前的难题是,如何使用常规运算符去处理新类型的运算。常规运算符表达简单的操作,很直观,例如,表达式data1+data2*data3就比multiplydata2bydata3andaddtheresulttodata1要直观得多。7.1问题引入但问题是,类似于+、*这样的运算符只能对于语言内建的类型(的数据)进行操作。而对于用户自定义类型的数据,编译器将不知道程序员要做什么。举个例子来说,
3、设有如下代码,试图用输出流运算符直接作用在矩形类对象之上:Rectanglerect(10,20);cout<4、e:doublereal,imag;public:complex(doubler=0.0,doublei=0.0):real(r),imag(i){}friendcomplexadd(constcomplex&c1,constcomplex&c2);friendcomplex&assign(constcomplex&c1,constcomplex&c2);//otheroperations};complexadd(constcomplex&c1,constcomplex&c2){complext5、emp(c1.real+c2.real,c1.imag+c2.imag);returntemp;}Complex&assign(constcomplex&c1,constcomplex&c2){c1.real=c2.real;c1.imag=c2.imag;returnc1;}7.1问题引入这样,两个复数相加就会用如下代码完成:complexc1(1.0,2.0),c2(3.0,4.0),c3;assign(c3,add(c1,c2));显然,这种函数式的运算多少显得有些别扭,明显不如赋值语句c6、3=c1+c2;直观清晰。然而问题是,如果这样做,那么编译器会因为complex不是内建类型而不能理解+运算符直接作用在两个复数类对象上有什么特殊含义。那么该怎么做呢?7.2运算符的重载形式在C++中,很多的运算符被当做是函数,这称为“运算符函数(operatorfunction)”,设运算符为@,那么它对应的运算符函数的原型可以形式化地表示为:返回值类型operator@(参数列表);这样,我们就可以像重载普通函数一样进行运算符函数的重载。与普通函数一样,运算符重载函数应该有返回类型和参数。一7、些特殊的运算符函数如类型转换运算符不能指定返回值类型。此外,返回值和参数的设定必须与重载的运算符的含义相匹配。7.2运算符的重载形式7.2.1运算符重载的语法在学习语法之前,我们先对操作数的概念作出定义,以便读者理解。在单目运算@oprd或oprd@中,oprd称为“操作数”;在双目运算oprdl@oprdr中,oprd1称为“左操作数”,oprdr称为“右操作数”在绝大多数情况下,参与重载运算的操作数(至少其中一个)是一个类对象,而重载的@运算函数与这个类相关。7.2运算符的重载形式运算符作为8、类的成员重载现在我们来为List重载的+=运算符,用于取代push_back()完成添加操作。在编写重载代码之前,我们还是先来研究一下+=运算符的特点。类似于+=这样的含有赋值操作的运算符有这样的特点:是双目运算符;运算符结果反映在了左操作数上,而不是产生一个新结果;运算的结果可以作为左值使用。7.2运算符的重载形式classList//简化版{private:structNode{QUADPTRquad;Node*next;}*head,*tail;public:List(constList&
4、e:doublereal,imag;public:complex(doubler=0.0,doublei=0.0):real(r),imag(i){}friendcomplexadd(constcomplex&c1,constcomplex&c2);friendcomplex&assign(constcomplex&c1,constcomplex&c2);//otheroperations};complexadd(constcomplex&c1,constcomplex&c2){complext
5、emp(c1.real+c2.real,c1.imag+c2.imag);returntemp;}Complex&assign(constcomplex&c1,constcomplex&c2){c1.real=c2.real;c1.imag=c2.imag;returnc1;}7.1问题引入这样,两个复数相加就会用如下代码完成:complexc1(1.0,2.0),c2(3.0,4.0),c3;assign(c3,add(c1,c2));显然,这种函数式的运算多少显得有些别扭,明显不如赋值语句c
6、3=c1+c2;直观清晰。然而问题是,如果这样做,那么编译器会因为complex不是内建类型而不能理解+运算符直接作用在两个复数类对象上有什么特殊含义。那么该怎么做呢?7.2运算符的重载形式在C++中,很多的运算符被当做是函数,这称为“运算符函数(operatorfunction)”,设运算符为@,那么它对应的运算符函数的原型可以形式化地表示为:返回值类型operator@(参数列表);这样,我们就可以像重载普通函数一样进行运算符函数的重载。与普通函数一样,运算符重载函数应该有返回类型和参数。一
7、些特殊的运算符函数如类型转换运算符不能指定返回值类型。此外,返回值和参数的设定必须与重载的运算符的含义相匹配。7.2运算符的重载形式7.2.1运算符重载的语法在学习语法之前,我们先对操作数的概念作出定义,以便读者理解。在单目运算@oprd或oprd@中,oprd称为“操作数”;在双目运算oprdl@oprdr中,oprd1称为“左操作数”,oprdr称为“右操作数”在绝大多数情况下,参与重载运算的操作数(至少其中一个)是一个类对象,而重载的@运算函数与这个类相关。7.2运算符的重载形式运算符作为
8、类的成员重载现在我们来为List重载的+=运算符,用于取代push_back()完成添加操作。在编写重载代码之前,我们还是先来研究一下+=运算符的特点。类似于+=这样的含有赋值操作的运算符有这样的特点:是双目运算符;运算符结果反映在了左操作数上,而不是产生一个新结果;运算的结果可以作为左值使用。7.2运算符的重载形式classList//简化版{private:structNode{QUADPTRquad;Node*next;}*head,*tail;public:List(constList&
此文档下载收益归作者所有