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

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

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

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

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

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

第12章运算符重载和类型重载在C++中有这样的情况,同一个类型或运算符在不同的类中代表不同的意思或者实施不同的运算,这就是面向对象的三大特点之一的多态。 函数重载是C++语言中多态的一种表现形式,运算符重载和类型重载是多态的另外两种表现形式。 运算符重载是对已有的运算符赋予多重含义。 C++中预定义的运算符的操作对象只能是基本数据类型,对于很多用户自定义类型,也需要有类似的运算操作,这就提出了对运算符进行重新定义,赋予已有符号以新功能的要求。 同一个运算符作用于不同类型的数据导致不同的行为。运算符重载只能对系统提供的已有运算定义新的运算含义,不能创造全新的运算符,同时还不能改变运算符原有的语法结构、操作数个数、优先级和结合性,不能有二义性。不是所有的运算符都能重载,不能重载的运算符有:作用域运算符(::)、条件运算符(?:)、直接成员访问运算符(.)、sizeof运算符、解除对指向类成员的指针的引用运算符(.*)。 运算符重载的关键字是operator。针对一个具体类的已有运算符重载有两种途径: 1)将运算符重新定义为类的成员函数; 2)将运算符重新定义为类的友元函数。一、运算符重载方法1.将运算符重载为类的成员函数【例题12.1】复数的加减运算符重载Complex::Complex(floatr,floati) { real=r;image=i; } voidComplex::Show(inti) {//一般情况下,这里不应该有参数i,本例的目的是为了区分不同的复数,便于观看结果 cout<<"复数:c"<<i<<"="<<real; if(image>0) cout<<"+"<<image<<"i"<<endl; if(image<0) cout<<image<<"i"<<endl; }ComplexComplex::Add(constComplex&c) { Complext; t.real=this->real+c.real; t.image=this->image+c.image; returnt; } ComplexComplex::operator+(constComplex&c) { Complext; t.real=this->real+c.real; t.image=this->image+c.image; returnt; } ComplexComplex::operator-(constComplex&c) { Complext; t.real=this->real-c.real; t.image=this->image-c.image; returnt; } Complex&Complex::operator+=(constComplex&c) { real=real+c.real; image=image+c.image; return*this; } Complex&Complex::operator=(constComplex&other) { if(this==&other) return*this; this->real=other.real; this->image=other.image; return*this; } intmain() { Complexc1(12,35),c2(20,46),c3,c4,c5,c6; c1.Show(1); c2.Show(2); c3=c1.Add(c2); c3.Show(3); c4=c1+c2; c4.Show(4); c2+=c1; c2.Show(2); c5=c1-c2; c5.Show(5); return0; } 如果我们把“operator+”看成函数名,可以在main()函数中写出如下语句: c3=c1.Add(c2); c3=c1.operator+(c2); 这时,operator+就完全是一个函数了(它本质上就是函数),.Add()和operator+的作用和功能完全相同,只是表现形式有些区别。【例题12.2】一元运算符重载,在Time类(描述时间的类,用三个数据成员分别存放时、分和秒)中重载自加运算符,即一个时间加上n秒后形成一个新的的时间。Time::Time(inth,intm,ints) { hour=h; minute=m; second=s; } voidTime::Show() { cout<<hour<<":"<<minute<<":"<<second<<endl; }TimeTime::operator++(int) { //返回原来的值,再加 Timetemp=*this; second++; if(second==60) { second=0; minute++; if(minute==60) {