第4章 运算符重载

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

北京邮电大学世纪学院
return c;}
void Complex∷display( ) { cout<<″(″<<real<<″,″<<imag<<″i)″<<endl;}
C++面向对象程序设计
int main( ) { Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; //运算符+用于复数运算 cout<<″c1=″;c1.display( ); cout<<″c2=″;c2.display( ); cout<<″c1+c2=″;c3.display( ); return 0; }
北京邮电大学世纪学院
(3)
C++面向对象程序设计
重载不能改变运算符运算对象(即操作数)的个数。 如关系运算符“>”和“<”等是双目运算符,重载后仍 为双目运算符,需要两个参数。运算符“+”,“-”, “*”,“&”等既可以作为单目运算符,也可以作为双 目运算符,可以分别将它们重载为单目或双目运算符。 (4) 重载不能改变运算符的优先级别。例如“*”和“/” 优先于“+”和“-”,不论怎样进行Hale Waihona Puke Baidu载,各运算符之间 的优先级别不会改变。 (5) 重载不能改变运算符的结合性。如赋值运算符“=” 是右结合性(自右至左),重载后仍为右结合性。 (6) 重载运算符的函数不能有默认的参数,否则就改变 了运算符参数的个数,与前面第(3)点矛盾。
c1.operator+(c2) //其中c1和c2是Complex类的对象
即以c2为实参调用c1的运算符重载函数 operator+(Complex &c2),进行求值,得到两个复 数之和。 注意“operator+”是一个函数名,它是Complex类 的成员函数。
北京邮电大学世纪学院
C++面向对象程序设计
北京邮电大学世纪学院
例4.1
C++面向对象程序设计
通过函数来实现复数相加。
#include <iostream> using namespace std; class Complex //定义Complex类 {public: Complex( ){real=0;imag=0;} //定义构造函数 Complex(double r,double i){real=r;imag=i;} //构造函数重载 Complex complex_add(Complex &c2); //声明复数相加函数 void display( ); //声明输出函数 private: double real; //实部 double imag; //虚部 }; Complex Complex∷complex_add(Complex &c2) //定义复数相加函数 {Complex c; c.real=real+c2.real; //两个复数的实部相加 c.imag=imag+c2.imag; //两个复数的虚部相加 return c;}
北京邮电大学世纪学院
C++面向对象程序设计
第四章
北京邮电大学世纪学院
C++面向对象程序设计
第4章 运算符重载
4.1 4.2 4.3 4.4
什么是运算符重载 运算符重载的方法 重载运算符的规则 运算符重载函数作为类成员函数和友元函数
北京邮电大学世纪学院
C++面向对象程序设计
4.1 什么是运算符重载
北京邮电大学世纪学院
(7)
C++面向对象程序设计
重载的运算符必须和用户定义的自定义类型的 对象一起使用,其参数至少应有一个是类对象(或 类对象的引用)。也就是说,参数不能全部是C++ 的标准类型,以防止用户修改用于标准类型数据的 运算符的性质。 int operator +(int a,int b) //错误 {return (a-b);} 两个参数一个是类对象,一个是C++标准类型的数 据是可以的,如: Complex operator +(int a, Complex &c) {return Complex(a+c.real,c.imag);} //可以,整数和复数相加
北京邮电大学世纪学院
C++面向对象程序设计
void Complex∷display( ) //定义输出函数 {cout<<″(″<<real<<″,″<<imag<<″i)″<<endl;}
int main( ) {Complex c1(3,4), c2(5,-10), c3; c3=c1.complex_add(c2); cout<<″c1=″; c1.display( ); cout<<″c2=″; c2.display( ); cout<<″c1+c2=″; c3.display( ); return 0; }
//定义3个复数对象 //调用复数相加函数 //输出c1的值 //输出c2的值 //输出c3的值
运行结果如下:
c1=(3+4i) c2=(5-10i) c1+c2=(8,-6i)
北京邮电大学世纪学院
C++面向对象程序设计
complex_add函数的两个赋值语句
c.real=real+c2.real; c.imag=imag+c2.imag; 相当于 c.real=this->real+c2.real; c.imag=this->imag+c2.imag; 因为在main函数中是通过c1对象调用的 complex_add 函数,因此相当于 c.real=c1.real+c2.real; c.imag=c1.imag+c2.imag;
Complex operator+ (Complex& c1,Complex& c2);
北京邮电大学世纪学院
C++面向对象程序设计
在上面的格式中operator是关键字,是专门用于
定义重载运算符的函数的,运算符名称就是C++提 供给用户的预定义运算符。 注意:函数名称是由operator和运算符组成的, operator+就是函数名,意为“对运算符+重载”。 两个形参是Complex类对象的引用,即要求实参 为Complex类对象。 在定义了重载运算符的函数后,可以说: 函数 operator+重载了运算符+。在执行复数相加的表达 式c1+c2时,系统就会调用operator+函数,把c1和 c2作为实参,与形参进行虚实结合。
北京邮电大学世纪学院
例4.2
C++面向对象程序设计
改写例4.1,重载运算符“+”,使之能用于 两个复数相加。
#include <iostream> using namespace std; class Complex {public: Complex( ){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} Complex operator+(Complex &c2); //声明重载运算符的函数 void display( ); private: double real; double imag; }; Complex Complex∷operator+(Complex &c2) //定义重载运算符的函数 { Complex c; c.real=real+c2.real; c.imag=imag+c2.imag;
北京邮电大学世纪学院
不能重载的运算符只有5个:
C++面向对象程序设计
. (成员访问运算符) .* (成员指针访问运算符) ∷ (域运算符) sizeof (长度运算符) ?: (条件运算符)
前两个运算符不能重载是为了保证访问成员的功
能不能被改变,域运算符和sizeof运算符的运算对 象是类型而不是变量或一般表达式,不具重载的特 征。
北京邮电大学世纪学院
C++面向对象程序设计
4.3 重载运算符的规则
(1)
C++不允许用户自己定义新的运算符,只能 对已有的C++运算符进行重载。 例如BASIC中可以用“**”作为幂运算符,如用 “3**5”表示35,但在C++中这样是不行的。 (2) C++允许重载的运算符 C++中绝大部分的运算符允许重载。具体规定见书 中表4.1。
北京邮电大学世纪学院
C++面向对象程序设计
上例结果是正确的,但调用方式不直观、比较烦
琐。能否也和整数的加法运算一样,直接用加号 “+”来实现复数运算呢?如 c3=c1+c2; 编译系统就会自动完成c1和c2两个复数相加的运算。 如果能做到,就为对象的运算提供了很大的方便。 这就需要对运算符“+”进行重载。
所谓重载,就是重新赋予新的含义。函数重载就是
对一个已有的函数赋予新的含义,使之同一个函数名 可以用来代表不同功能的函数。 运算符也可以重载。例如“+”,“>>”,“<<”。 本章讨论的问题是: 用户能否根据自己的需要对 C++已提供的运算符进行重载,赋予它们新的含义, 使之一名多用。譬如,能否用“+”号进行两个复数 的相加。在C++中不能在程序中直接用运算符“+” 对复数进行相加运算。用户必须自己设法实现复数相 加。例如用户可以通过定义一个专门的函数来实现复 数相加。见例4.1。
北京邮电大学世纪学院
C++面向对象程序设计
4.2 运算符重载的方法
运算符重载的方法是定义一个重载运算符的函数,
在需要执行被重载的运算符时,系统就自动调用该 函数,以实现相应的运算。也就是说,运算符重载 是通过定义函数实现的。运算符重载实质上是函数 的重载。 重载运算符的函数一般格式如下: 函数类型 operator 运算符名称 (形参表列) { 对运算符的重载处理 } 例如,想将“+”用于Complex类(复数)的加法运算, 函数的原型可以是这样的:
北京邮电大学世纪学院
C++面向对象程序设计
为了说明在运算符重载后,执行表达式就是调用
函数的过程,可以把两个整数相加也想像为调用下 面的函数:
int operator + (int a,int b) {return (a+b);}
如果有表达式5+8,就调用此函数,将5和8作为调
用函数时的实参,函数的返回值为13。这就是用函 数的方法理解运算符。 可以在例4.1程序的基础上重载运算符“+”,使 之用于复数相加。
运行结果与例4.1相同:
c1=(3+4i) c2=(5-10i) c1+c2=(8,-6i)
北京邮电大学世纪学院
C++面向对象程序设计
请比较例4.1和例4.2,只有两处不同:
(1) 在例4.2中以operator+函数取代了例4.1中的 complex_add函数,而且只是函数名不同,函数体 和函数返回值的类型都是相同的。 (2) 在main函数中,以“c3=c1+c2;”取代了例4.1中 的“c3=c1.complex_add(c2);”。在将运算符+重载 为类的成员函数后,C++编译系统将程序中的表达 式c1+c2解释为
虽然重载运算符所实现的功能完全可以用函数实
现,但是使用运算符重载能使用户程序易于编写、 阅读和维护。 对上面的运算符重载函数operator+还可以改写得 更简练一些:
Complex Complex∷operator + (Complex &c2) {return Complex(real+c2.real, imag+c2.imag);} return语句中的Complex(real+c2.real, imag+c2.imag)是建 立一个临时对象,它没有对象名,是一个无名对象。在建 立临时对象的过程中调用构造函数。return语句将此临时对 象作为函数的返回值。
北京邮电大学世纪学院
C++面向对象程序设计
注意:在例4.2中不能用一个常量与复数对象相加
c3=3+c2; //错误,与形参类型不匹配 c3=Complex(3,0)+c2; //正确,类型均为对象 需要说明的是: 运算符被重载后,其原有的功能仍然 保留,没有丧失或改变。如3+5依然代表整数相加,是 否调用运算符重载函数由编译系统判别运算符两侧的数 据类型决定。 通过运算符重载,扩大了C++已有运算符的作用范围, 使之能用于类对象。把运算符重载和类结合起来,可以 在C++程序中定义出很有实用意义而使用方便的新的数 据类型。 运算符重载使C++具有更强大的功能、更好的可扩充 性和适应性,这是C++最吸引人的特点之一。
相关文档
最新文档