实验十运算符重载1.实验目的及要求1)掌握运算符重载的基本概念和方法。
2)熟习几种特殊的运算符的重载。
2.实验内容1.分析下面的程序,指出程序运行的结果:1)#include<iostream.h>class point{int x,y;public:point(int vx,int vy){x=vx; y=vy;}point(){x=0,y=0;}point operator+(point p1){int px=x+p1.x;int py=y+p1.y;return point(px,py);}point operator-(point p1){point p;int px=x-p1.x;int py=y-p1.y;return point(px,py);}void print(){cout<<x<<","<<y<<endl;}};void main(void){point p1(10,10),p2(20,20);p1=p1+p2;p1.print();//p2.print();//p3.print();}程序分析:运行结果为:30,30Press any key to continue2)分析下面程序,指出程序运行的结果:#include<iostream.h>static int dys[]={31,28,31,30,31,30,31,31,30,31,30,31}; class date{int mo,da,yr;public:date(int m,int d,int y){mo=m;da=d;yr=y;}date(){}void disp(){cout<<mo<<"/"<<da<<"/"<<yr<<endl;}date operator+(int day){date dt=*this;day+=dt.da;//cout<<day<<endl;while(day>dys[dt.mo-1]){day-=dys[dt.mo-1];//cout<<day<<endl;if(++dt.mo==13){dt.mo=1;dt.yr++;}}//cout<<day<<endl;//dt.disp();dt.da=day;return dt;}};void main(void){date d1(5,31,2009),d2;//d1.disp();d2=d1+20;d2.disp();}程序运行结果:6/20/2009Press any key to continue3)p256 5.14 5.15 5.165.14实验结果:76Press any key to continue5.15实验结果:This is C++book.第1个字符:T第16个字符:.第25个字符:数组下标超界!Press any key to continue5.16实验结果:m=1.5千米Press any key to continue三. 编写并调试程序.定义一个描述平面上一个点的类point,重载“++”和“--”运算符,并区分这两种运算符的前置和后置操作,构成一个完整的程序。
(参考例5.8)程序代码:#include<iostream>using namespace std;class point{public:point(int I1=0,int I2=0,int I3=0);void print();point operator--();point operator--(int);point operator++();point operator++(int);private:int i,j,k;};point::point(int I1,int I2,int I3){i=I1;j=I2;k=I3;}void point::print(){cout<<"i: "<<i<<"j: "<<j<<"k: "<<k<<endl;} point point::operator --(){--i;--j;--k;return *this;}point point::operator --(int){point temp(*this);i--;j--;k--;return temp;}point point::operator ++(){++i;++j;++k;return *this;}point point::operator ++(int){point temp(*this);i++;j++;k++;return temp;}int main(){point obj1(4,5,6),obj2,obj3(11,12,13),obj4;--obj1;obj1.print();obj2=obj1--;obj2.print();obj1.print();cout<<endl;obj3.print();obj3.operator--();obj3.print();obj4=obj3.operator --(0);obj4.print();obj3.print();cout<<endl;point obj5(4,5,6),obj6,obj7(11,12,13),obj8; obj5.print();++obj5;obj5.print();obj6=obj5++;obj6.print();obj5.print();cout<<endl;obj7.operator++();obj7.print();obj8=obj7.operator ++(0); obj8.print();obj7.print();cout<<endl;}程序运行的结果是:i: 4j: 5k: 6i: 3j: 4k: 5i: 3j: 4k: 5i: 2j: 3k: 4i: 11j: 12k: 13i: 10j: 11k: 12i: 10j: 11k: 12i: 9j: 10k: 11i: 4j: 5k: 6i: 5j: 6k: 7i: 5j: 6k: 7i: 6j: 7k: 8i: 11j: 12k: 13i: 12j: 13k: 14i: 12j: 13k: 14i: 13j: 14k: 15Press any key to continue2)构造一个分数类rationalNumber,该类中包括分子和分母两个成员数据,并具有下述功能:1建立构造函数,它能防止分母为0,当分数不是最简形式时进行约分,并避免分母为负数。
2重载加法、减法、乘法和除法运算符。
3重载关系运算符:>、<、==等。
提示:分数约分函数:class rationalNumber //分数类{ int fm,fz; //fm—分母fz—分子……};void simple() //约分函数{ int k,i;if(abs(fz)<fm)k=abs(fz);elsek=fm;for(i=1;i<=k;i++){if(fz%i==0 && fm%i==0){fz=fz/i;fm=fm/i;}}}//m,n的最大公约数,假定m、n的最大公约数是v,则它们的最小公倍数就是m*n/v。
int fun (int m,int n){int k;if(m>n)k=n;else k=m;for(;k>0;k--)if(m%k==0&&n%k==0)return k;return 1;}程序代码:#include<iostream.h>#include<stdlib.h>#include<math.h>class rationalNumber{int mother,child;public:rationalNumber(int,int);rationalNumber(){}rationalNumber operator+(rationalNumber t);rationalNumber operator-(rationalNumber t);rationalNumber operator*(rationalNumber t);rationalNumber operator/(rationalNumber t);void operator>(rationalNumber t);void operator<(rationalNumber t);void operator==(rationalNumber t);void print(){cout<<child<<"/"<<mother<<'\t';}void simple(){ int k,i;if(abs(child)<mother)k=abs(child);elsek=mother;for(i=1;i<=k;i++){if(child%i==0&&mother%i==0){child=child/i;mother=mother/i;}}}};rationalNumber::rationalNumber(int m,int c){if(m>0){mother=m;child=c;}else{if(m=0){cout<<"该分母是不合法的!"<<endl;}else{mother=-m;child=-c;}}simple();}rationalNumber rationalNumber::operator+(rationalNumber t) {rationalNumber te;te.mother=mother*t.mother;te.child=child*t.mother+mother*t.child;te.simple();return te;}rationalNumber rationalNumber::operator-(rationalNumber t) {rationalNumber te;te.mother=mother*t.mother;te.child=child*t.mother-mother*t.child;te.simple();return te;}rationalNumber rationalNumber::operator*(rationalNumber t) {rationalNumber te;te.mother=mother*t.mother;te.child=child*t.child;te.simple();return te;}rationalNumber rationalNumber::operator/(rationalNumber t){rationalNumber te;te.mother=mother*t.child;te.child=child*t.mother;te.simple();return te;}void rationalNumber::operator>(rationalNumber t){int d=child*t.mother-mother*t.child;if(d>0)cout<<child<<"/"<<mother<<">"<<t.child<<"/"<<mother<<endl;elsecout<<child<<"/"<<mother<<"<="<<t.child<<"/"<<mother<<endl; }void rationalNumber::operator<(rationalNumber t){int d=child*t.mother-mother*t.child;if(d<0)cout<<child<<"/"<<mother<<"<"<<t.child<<"/"<<mother<<endl;elsecout<<child<<"/"<<mother<<">="<<t.child<<"/"<<mother<<endl;}void rationalNumber::operator==(rationalNumber t){int d=child*t.mother-mother*t.child;if(d==0)cout<<child<<"/"<<mother<<"="<<t.child<<"/"<<mother<<endl;elsecout<<child<<"/"<<mother<<"!="<<t.child<<"/"<<mother<<endl; }void main(){rationalNumber p1(6,7),p2(4,8),p3;p1.print();p2.print();cout<<endl<<endl<<"p1+p2=";p3=p1+p2;p3.print();cout<<endl<<"p1-p2=";p3=p1-p2;p3.print();cout<<endl<<"p1*p2=";p3=p1*p2;p3.print();cout<<endl<<"p1/p2=";p3=p1/p2;p3.print();cout<<endl<<endl;p1>p2;p1<p2;p1==p3;}程序执行的结果为:7/6 4/2p1+p2=19/6p1-p2=-5/6p1*p2=14/6p1/p2=7/127/6<=4/67/6<4/67/6!=7/6Press any key to continue。