程序设计实习第二十一讲习题课://北京大学《程序设计实习》课程类和对象基本概念(1)写出下面程序的运行结果classApple{private:staticintnTotalNumber;public:Apple(){nTotalNumber++;}~Apple(){nTotalNumber--;}staticvoidPrintTotal(){coutnTotalNumberendl;}};intApple::nTotalNumber=0;AppleFun(constApple&a){a.PrintTotal();returna;}intmain(){Apple*p=newApple[4];Fun(p[2]);Applep1,p2;delete[]p;p1.PrintTotal();}解析:return返回时,产生临时变量,TotalNumber析构时会减小41北京大学《程序设计实习》课程类和对象基本概念(2)*写出下面程序的运行结果classSample{public:intv;Sample(){};Sample(intn):v(n){};Sample(Sample&x){v=2+x.v;}};SamplePrintAndDouble(Sampleo){couto.vendl;o.v=2*o.v;returno;}intmain(){Samplea(5);Sampleb=a;Samplec=PrintAndDouble(b);coutc.vendl;Sampled;d=a;coutd.v;}解析:构造函数和复制构造函数的调用9225注意区分:Sampleb=a;d=a;北京大学《程序设计实习》课程类和对象基本概念(3)程序输出结果如下,请填空05classA{public:intval;A(____________){val=n;};___________GetObj(){return________;}};main(){Aa;couta.valendl;a.GetObj()=5;couta.valendl;}A(intn=0)A&GetObj(){return*this;}或者int&GetObj(){returnval;}北京大学《程序设计实习》课程类和对象基本概念(4)程序输出结果如下,请填空3+4i5+6i补足Complex类的成员函数,不能增加成员变量classComplex{private:doubler,i;public:voidPrint(){coutr+iiendl;}};intmain(){Complexa;a=3+4i;a.Print();a=5+6i;a.Print();}北京大学《程序设计实习》课程类和对象基本概念(4)构造函数Complex(){};Complex(constchart[]){if(!t){r=0.0;i=0.0;}else{r=t[0]-'0';i=t[2]-'0';}}另一种思路重载赋值操作符Complex&operator=(constchart[]){if(!t){r=0.0;i=0.0;}else{r=t[0]-'0';i=t[2]-'0';}return*this;}北京大学《程序设计实习》课程类和对象基本概念(5)程序输出结果如下,请填空10补足Sample类的成员函数,不能增加成员变量classSample{public:intv;Sample(intn):v(n){};};main(){Samplea(5);Sampleb=a;coutb.v;}Sample(Sample&x){v=2*x.v;}北京大学《程序设计实习》课程类和对象基本概念(6)程序输出结果如下,请填空ThisHello补足MyString类的成员函数,不能增加成员变量classMyString{char*p;public:MyString(char*s){p=newchar[strlen(s)+1];strcpy(p,s);}~MyString(){delete[]p;}constchar*c_str(){returnp;}};main(){MyStrings1(This),s2=s1;s2.Copy(Hello);couts1.c_str()endls2.c_str();}北京大学《程序设计实习》课程类和对象基本概念(6)补足成员函数voidCopy(char*s){delete[]p;p=newchar[strlen(s)+1];strcpy(p,s);}MyString(MyString&o){p=newchar[strlen(o.p)+1];strcpy(p,o.p);}北京大学《程序设计实习》课程类和对象基本概念(7)程序输出结果如下,请填空5,55,5classBase{public:intk;Base(intn):k(n){}};classBig{public:intv;Baseb;Big_____________{}Big_____________{}};main(){Biga1(5);Biga2=a1;couta1.v,a1.b.kendl;couta2.v,a2.b.kendl;}Big(intn):v(n),b(n){}Big(Big&x):v(x.v),b(x.b.k){}北京大学《程序设计实习》课程运算符重载(1)程序输出结果如下,请填空4,1请写出被隐藏的部分,MyInt的成员函数里不允许使用静态变量classMyInt{intnVal;public:MyInt(intn){nVal=n;}intReturnVal(){returnnVal;}………………….};main(){MyIntobjInt(10);objInt-2-1-3;coutobjInt.ReturnVal();cout,;objInt-2-1;coutobjInt.ReturnVal();}MyInt&operator-(intx){nVal-=x;return*this;}北京大学《程序设计实习》课程运算符重载(2)*程序输出结果如下,请填空(4,5)(7,8)classPoint{private:intx;inty;public:Point(intx_,inty_):x(x_),y(y_){};_____;};_____operator(_____,constPoint&p){_____;return______;}main(){coutPoint(4,5)Point(7,8);}北京大学《程序设计实习》课程运算符重载(2)classPoint{private:intx;inty;public:Point(intx_,inty_):x(x_),y(y_){};_____;};_____operator(_____,constPoint&p){_____;return______;}friendostream&operator(ostream&o,constPoint&p);ostream&operator(ostream&o,constPoint&p)o(p.x,p.y)endl;o北京大学《程序设计实习》课程运算符重载(3)*程序输出结果如下,写一个二维数组类Array20,1,2,3,4,5,6,7,8,9,10,11next0,1,2,3,4,5,6,7,8,9,10,11北京大学《程序设计实习》课程运算符重载(3)usingstd::cout;usingstd::endl;intmain(){Array2a(3,4);inti,j;for(i=0;i3;i++)for(j=0;j4;j++)a[i][j]=i*4+j;for(i=0;i3;i++){for(j=0;j4;j++){couta(i,j),;}coutendl;}coutnextendl;Array2b;b=a;for(i=0;i3;i++){for(j=0;j4;j++){coutb[i][j],;}coutendl;}return0;}北京大学《程序设计实习》课程运算符重载(3)classArray2{private:int*p;intr,c;public:Array2(){p=NULL;}Array2(intr_,intc_):r(r_),c(c_){p=newint[r*c];}Array2(Array2&a):r(a.r),c(a.c){p=newint[r*c];memcpy(p,a.p,sizeof(int)*r*c);}Array2&operator=(constArray2&a){if(p)delete[]p;r=a.r;c=a.c;p=newint[r*c];memcpy(p,a.p,sizeof(int)*r*c);return*this;}~Array2(){if(p)delete[]p;}int*operator[](inti){returnp+i*c;}int&operator()(inti,intj){returnp[i*c+j];}注:重载的实际上是第二维的[],第一维的[]直接调用int型一维数组的定义北京大学《程序设计实习》课程运算符重载(3):第二种解法classCWordArr{private:int*m_pdat;longm_size;public:CWordArr(longsize){m_pdat=newint[size];m_size=size;};~CWordArr(){delete[]m_pdat;};int&operator[](longidx){returnm_pdat[idx];}};北京大学《程序设计实习》课程运算符重载(3):第二种解法classArray2{private:CWordArr**m_p;longm_col,m_row;public:Array2(longcol,longrow){m_p=newCWordArr*[col];for(longi=0;icol;i++)m_p[i]=newCWordArr(row);m_col=col;m_row=row;}~Array2(){for(longi=0;im_col;i++){deletem_p[i];m_p[i]=NULL;}delete[]m_p;}CWordArr&operator[](longidx){return*m_p[idx];}int&operator()(inti,intj){return(*m_p[i])[j];}通过两次[]重载的叠加,就可以用a[x][y]的方式来访问数组元素•C++不可能在一个类里面实现[][]的重载(若这种相当于三元算符),因此有两个类:一个是一维数组类,实现[]的重载;另一个类是二维数组类,必须持有一组一维数组类的实例,存放二维数组的各个行的数组,二维数组类也要重载[]运算符北京大学《程序设计实习》课程运算符重载(4)程序输出结果如下,写一个HugeInt类1)1000000890000002)1000000890000003)100004)100005)100016)100067)100000089010006北京大学《程序设计实习》课程运算符重载(4)voidmain(){CHugeInta(1234545436342424354354365289899834234235);CHugeIntd(9999);CHugeInttemp=CHugeInt(100000088888888)+111112;CHugeInttemp2=111112+CHu