運算符重載實驗報告_第1頁
運算符重載實驗報告_第2頁
運算符重載實驗報告_第3頁
運算符重載實驗報告_第4頁
運算符重載實驗報告_第5頁
已閱讀5頁,還剩31頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

本文格式為Word版,下載可任意編輯——運算符重載實驗報告實

課程名稱

程序設計語言C/C++

試驗工程

運算符重載

一、試驗目的

1、理解重載運算符的意義;

2、把握成員函數、友元函數重載運算符的定義及使用方法;

3、把握動態聯編、虛函數、純虛函數和抽象類的概念;4、把握虛函數、純虛函數和抽象類的定義及使用方法。

二、試驗內容

1.上機分析下面程序,把握運算符重載的方法。

要求:

(1)給出試驗結果;(2)把握重載"+、-、、='運算符重載的方法。

#includeiostreamusingnamespacestd;

classCOMPLEX

{

public:

COMPLEX(doubler=0,doublei=0);

//構造函數

COMPLEX(constCOMPLEXother);

//拷貝構造函數

voidprint();

//打印復數

COMPLEXoperator+(constCOMPLEXother);

//重載加法運算符(二元)

COMPLEXoperator-(constCOMPLEXother);

//重載減法運算符(二元)

COMPLEXoperator-();

//重載求負運算符(一元)

COMPLEXoperator=(constCOMPLEXother);

//重載賦值運算符(二元)

protected:

doublereal,image;

//復數的實部與虛部

};

COMPLEX::COMPLEX(doubler,doublei){

real=r;

image=i;}

COMPLEX::COMPLEX(constCOMPLEXother)

{

real=other.real;

image=other.image;}

voidCOMPLEX::print(){

coutreal;

if(image0)

cout+imagei;

elseif(image0)

coutimagei;

coutendl;}

COMPLEX

COMPLEX::operator+(constCOMPLEXother){

COMPLEXtemp;

temp.real=real+other.real;

//real=real+other.real;

temp.image=image+other.image;

//image=image+other.image;

returntemp;

//*this;}

COMPLEXCOMPLEX::operator-(constCOMPLEXother){

COMPLEXtemp;

temp.real=real-other.real;

temp.image=image-other.image;

returntemp;

}

COMPLEXCOMPLEX::operator-(){

COMPLEXtemp;

temp.real=-real;

temp.image=-image;

returntemp;}

COMPLEXCOMPLEX::operator=(constCOMPLEXother){

real=other.real;

image=other.image;

return*this;

//返回對象值}

intmain()

{

COMPLEXc1(1,2);

//定義一個值為1+2i的復數c1

COMPLEXc2(2);

//定義一個值為2的復數c2

COMPLEXc3(c1);

//用COMPLEX(constCOMPLEXother)創立一個值同c1的新復數

c3.print();

//打印c3原來的值

c1=c1+c2+c3;

//將c1加上c2再加上c3賦值給c1

c2=-c3;

//c2等于c3求負

c3=c2-c1;

//c3等于c2減去c1

c3.print();

//再打印運算后c3的值

coutsizeof(c1)endl;

return0;

}2.上機分析下面程序,給出輸出結果。

要求:

(1)給出試驗結果;

(2)把握友元運算符重載的基本方法:通過重載cout語句,可使用cout輸出對象的數據成員值的方法。

#includeiostream.hclassT{

intx,y;

public:

T(inta,intb)

{x=a;y=b;}

friendostreamoperator(ostreamos,Ta);};

ostreamoperator(ostreamos,Ta){osx=a.x

y=a.y;

returnos;}

voidmain(){

Ta(1,2);

coutaendl;}

3、上機分析下面程序,把握抽象類、純虛函數以及動態綁定的定義和使用。

要求:

(1)給出試驗結果;

(2)把握抽象類、純虛函數以及動態綁定的方法。

//shape.h文件定義抽象基類Shape

#ifndefSHAPE_H#defineSHAPE_HclassShape{

public:

virtualdoubleArea()const

{

return0.0;

}

//純虛函數,在派生類中重載

virtualvoidPrintShapeName()const=0;

virtualvoidPrint()const=0;};#endif

//point.h文件定義類Point#ifndefPOINT_H#definePOINT_H#includeiostreamusingnamespacestd;classPoint:publicShape{

intx,y;

//點的x和y坐標

public:

Point(int=0,int=0);

//構造函數

voidSetPoint(inta,intb);

//設置坐標

intGetX()const//取x坐標

{

returnx;

}

intGetY()const//取y坐標

{

returny;

}

virtualvoidPrintShapeName()const

{

coutPoint:;

}

virtualvoidPrint()const;//輸出點的坐標};#endif

//Point.cpp文件

Point類的成員函數定義

#includeiostreamusingnamespacestd;

Point::Point(inta,intb):x(a),y(b)

{}voidPoint::SetPoint(inta,intb)

{

x=a;

y=b;}

voidPoint::Print()const

{

cout"["x,y"]";}

//circle.h定義類Circle

#ifndefCIRCLE_H

#defineCIRCLE_H

#includeiostreamusingnamespacestd;

classCircle:publicPoint

{

doubleradius;

public:

Circle(intx=0,inty=0,doubler=0.0);

voidSetRadius(doubler);

//設置半徑

doubleGetRadius()const;

//取半徑

virtualdoubleArea()const;

//計算面積a

virtualvoidPrint()const;

//輸出圓心坐標和半徑

virtualvoidPrintShapeName()const

{

coutCircle:;

}

};

#endif

//circle.cpp文件

circle類的成員函數定義

Circle::Circle(inta,intb,doubler):Point(a,b),radius(r)

{}

voidCircle::SetRadius(doubler)

{

radius=(r=0?r:0);

}

doubleCircle::GetRadius()const

{

returnradius;

}

doubleCircle::Area()const

{

return3.14159*radius*radius;}

voidCircle::Print()const

{

coutCenter=;

Point::Print();

cout;Radius=radiusendl;

}

//main.cpp文件演示圖形類

#includeiostream

usingnamespacestd;

voidvirtualViaPointer(constShape*);

voidvirtualViaReference(constShape);

intmain()

{

Pointpoint(30,50);

//創立point、circle對象

Circlecircle(120,80,10.0);

point.PrintShapeName();

//輸出point、circle、rectangle對象信息

point.Print();

coutendl;

circle.PrintShapeName();

circle.Print();

Shape*arrayOfShapes[2];

//定義基類對象指針

arrayOfShapes[0]=point;

arrayOfShapes[1]=circle;

coutVirtualfunctioncallsmadeoffbase-classpointers\n;

//通過基類對象指針訪問派生類對象

for(inti=0;i2;i++)

{

virtualViaPointer(arrayOfShapes[i]);

}

coutVirtualfunctioncallsmadeoffbase-classreferences\n;

for(intj=0;j2;j++)

{

virtualViaReference(*arrayOfShapes[j]);

}

return0;}voidvirtualViaPointer(constShape*baseClassPtr)

//通過基類對象指針訪問虛函數實現動態綁定

{

baseClassPtr-PrintShapeName();

baseClassPtr-Print();

coutArea=baseClassPtr-Area()endl;

}//通過基類對象引用訪問虛函數實現動態綁定

voidvirtualViaReference(constShapebaseClassRef){

baseClassRef.PrintShapeName();

baseClassRef.Print();

coutArea=baseClassRef.Area()endl;}4、上機完成下面試驗。

聲明一個Shape(外形)基類,它有兩個派生類:Circle(圓)和Square(正方形),要求利用多態性的概念,分別以虛函數的形式完成對圓和正方形的周長及面積的計算。

要求:Shape類的數據成員包括中心點的坐標,Circle類和Square類初始值分別給出:

圓的圓心和半徑;正方形的中心和一個頂點。

(參考)

實數矩陣類//頭文件MatrixException.h

#includestdexcept

#includestring

usingnamespacestd;

classMatrixException:publiclogic_error

{

public:

MatrixException(conststrings):logic_error(s)

{}

};

classSingular:publicMatrixException

{

public:

Singular(conststrings):MatrixException(Singular:+s)

{}

};classInvalidIndex:publicMatrixException

{

public:

InvalidIndex(conststrings):MatrixException(Invalidindex:+s)

{}

};

classIncompatibleDimension:publicMatrixException

{

public:

IncompatibleDimension(conststrings):MatrixException(IncompatibleDimensions:+s)

{}};

//頭文件Matrix.h//#includeMatrixException.h

classMatrix

{

private:

double*elems;

//存放矩陣中各元素,按行存放

introw,col;

//矩陣的行與列

protected:

doublerowTimesCol(inti,constMatrixb,intj)const;

//矩陣的第i行矩陣b的第j列相乘

public:

Matrix(intr,intc);

Matrix(double*m,intr,intc);

Matrix(constMatrixm);

~Matrix();

//重載運算符=,實現矩陣賦值,若進行運算的矩陣維數不同,拋出IncompatibleDimension異常

Matrixoperator=(constMatrixb)throw(IncompatibleDimension);

//重載運算符(),用來返回某一個矩陣元素值,若所取矩陣下標非法,拋出InvalidIndex異常

doubleoperator()(inti,intj)throw(InvalidIndex);

constdoubleoperator()(inti,intj)constthrow(InvalidIndex);

//給矩陣元素賦值,若所設置矩陣元素下標非法,拋出InvalidIndex異常

voidSetElem(inti,intj,doubleval)throw(InvalidIndex);

//重載運算符*,實現矩陣相乘,若前一個矩陣的列數不等于后一個矩陣的行數,拋出IncompatibleDimension異常

Matrixoperator*(constMatrixb)constthrow(IncompatibleDimension);

//重載運算符+,實現矩陣相加,若進行運算的矩陣維數不同,拋出IncompatibleDimension異常

Matrixoperator+(constMatrixb)constthrow(IncompatibleDimension);

//重載運算符-,實現矩陣相減//若進行運算的矩陣維數不同,拋出IncompatibleDimension異常

Matrixoperator-(constMatrixb)constthrow(IncompatibleDimension);

voidPrint()const;

//按行顯示輸出矩陣中各元素

};

//成員函數的定義文件Matrix.cpp

#includeiostream

#includestrstream

#includestring

//#includeMatrix.h

usingnamespacestd;

stringint2String(inti)

//將整型數轉換為String類型

{

charbuf[64];

ostrstreammystr(buf,64);

mystri"\0";

returnstring(buf);

}

Matrix::Matrix(intr,intc)

{

if(r0c0)

{

row=r;

col=c;

elems=newdouble[r*c];//為矩陣動態分派存儲

}

else

{

elems=NULL;

row=col=0;

}

}Matrix::Matrix(double*m,intr,intc)

{

if(r0c0)

{

row=r;

col=c;

elems=newdouble[r*c];

}

else

{

elems=NULL;

row=col=0;

}

if(elems!=NULL)

{

for(inti=0;ir*c;i++)

{

elems[i]=m[i];

}

}

}

Matrix::Matrix(constMatrixm):row(m.row),col(m.col){

if(NULL==m.elems)

{

elems=NULL;

}

else

{

inttotal=row*col;

elems=newdouble[total];

for(inti=0;itotal;++i)

{

elems[i]=m.elems[i];

}

}

}

Matrix::~Matrix()

{

delete[]elems;//釋放矩陣所占的存儲

}MatrixMatrix::operator=(constMatrixb)

throw(IncompatibleDimension)

{

if(this==b)

{

return*this;

}

if(col!=b.col||row!=b.row

)

{

throw(IncompatibleDimension(Matrix+int2String(row)

+x+int2String(col)+equailsmatrix

+int2String(b.row)+x+int2String(b.col)+.));

}

row=b.row;

col=b.col;

delete[]elems;

if(NULL==b.elems)

{

elems=NULL;

}

else

{

inttotal=row*col;

elems=newdouble[total];

for(inti=0;itotal;++i)

{

elems[i]=b.elems[i];

}

}

return*this;

}//重載運算符()可以由給出的矩陣行列得到相應的矩陣元素值。之所以重載()而不是[],是由于避免數組elems所造成的二義性

doubleMatrix::operator()(intr,intc)throw(InvalidIndex)

{

if(r0||r=row||c0||c=col)

{

throw(InvalidIndex(string(GetElement()

+int2String(r)+,+int2String(c)+)

+from(

+int2String(row)+x

+int2String(col)+)+matrix.));

}

returnelems[r*col+c];

}

constdoubleMatrix::operator()(intr,intc)constthrow(InvalidIndex)

{

if(r0||r=row||c0||c=col)

{

throw(InvalidIndex(string(GetElement()

+int2String(r)+,+int2String(c)+)

+from(

+int2String(row)+x

+int2String(col)+)+matrix.));

}

returnelems[r*col+c];

}

voidMatrix::SetElem(intr,intc,doubleval)throw(InvalidIndex)

{

if(r0||r=row||c0||c=col)

{

throw(InvalidIndex(string(SetElement()

+int2String(r)+,+int2String(c)+)

+for(

+int2String(row)+x

+int2String(col)+)+matrix.));

}

elems[r*col+c]=val;

}

MatrixMatrix::operator*(constMatrixb)constthrow(IncompatibleDimension)

{

if(col!=b.row)

//incompatibledimensions

{

throw(IncompatibleDimension(Matrix+int2String(row)

+x+int2String(col)+timesmatrix

+int2String(b.row)+x+int2String(b.col)+.));

}

Matrixans(row,b.col);

for(intr=0;rrow;r++)

{

for(intc=0;cb.col;c++)

{

ans.SetElem(r,c,rowTimesCol(r,b,c));

}

}

returnans;}

MatrixMatrix::operator+(constMatrixb)constthrow(IncompatibleDimension)

{

if(col!=b.col||row!=b.row

)

{

throw(IncompatibleDimension(Matrix+int2String(row)

+x+int2String(col)+addsmatrix

+int2String(b.row)+x+int2String(b.col)+.));

}

Matrixans(row,col);

for(intr=0;rrow;r++)

{

for(intc=0;ccol;c++)

{

ans.SetElem(r,c,elems[r*col+c]+b.elems[r*col+c]);

}

}

returnans;

}

MatrixMatrix::operator-(constMatrixb)constthrow(IncompatibleDimension)

{

if(col!=b.col||row!=b.row

)

{

throw(IncompatibleDimension(Matrix+int2String(row)

+x+int2String(col)+minusmatrix

+int2String(b.row)+x+int2String(b.col)+.));

}

Matrixans(row,col);

for(intr=0;rrow;r++)

{

for(intc=0;ccol;c++)

{

ans.SetElem(r,c,elems[r*col+c]-b.elems[r*col+c]);

}

}

returnans;}

voidMatrix::Print()const

{

for(inti=0;irow;i++)

{

for(intj=0;jcol-1;j++)

{

coutelems[i*col+j]\t;

}

coutelems[i*col+col-1];

coutendl;

}

coutendl;

}

doubleMatrix::rowTimesCol(inti,constMatrixb,intj)const

{

doublesum=0.0;

for(intk=0;kcol;k++)

{

sum+=elems[i*col+k]*b.elems[k*b.col+j];

}

returnsum;}

//測試文件MatrixMain.cpp

#includeiostream

//#includeMatrix.h

usingnamespacestd;

intmain()

{

try

{

//創立矩陣對象

doublea[20]={1.0,3.0,-2.0,0.0,4.0,-2.0,-1.0,5.0,-7.0,2.0,0.0,8.0,4.0,1.0,-5.0,3.0,-3.0,2.0,-4.0,1.0};

doubleb[15]={4.0,5.0,-1.0,2.0,-2.0,6.0,7.0,8.0,1.0,0.0,3.0,-5.0,9.0,8.0,-6.0};

Matrixx1(a,4,5);

coutthematrixofx1is:endl;

x1.Print();

Matrixy1(b,5,3);

coutthematrixofy1is:endl;

y1.Print();

Matrixz1=x1*y1;

//兩個矩陣相乘

coutthematrixofz1=x1*y1is:endl;

z1.Print();

Matrixx2(2,2);

x2.SetElem(0,0,1.0);//為矩陣對象添加元素

x2.SetElem(0,1,2.0);

x2.SetElem(1,0,3.0);

x2.SetElem(1,1,4.0);

coutthematrixofx2is:endl;

x2.Print();

coutx1*x2is:endl;

x1*x2;

//兩個維數不匹配矩陣相乘,產生異常

coutx1-x2is:endl;

x1-x2;

//兩個維數不匹配矩陣相減,產生異常

coutSetanewelementforx1:endl;

x1.SetElem(7,8,30);

//設置矩陣元素超界,產生異常

coutGetaelementfromx1:endl;

x1(4,5);

//取不存在的矩陣元素,產生異常

}

catch(MatrixExceptione)

{

coute.what()endl;//獲取異常信息

}

return0;

}三、試驗步驟及結果分析

1.程序的類結構圖為:

COMPLEX

#real:double#image:double+COMPLEX(doubler=0,doublei=0)+COMPLEX(constCOMPLEXother)+print():void

+operator+(constCOMPLEXother):COMPLEX+operator-(constCOMPLEXother):COMPLEX+operator-():COMPLEX+operator=(constCOMPLEXother):COMPLEX

運行結果

2.程序的類結構圖為:

TT

x,y:int

+T(inta,intb)

+operator(ostreamos,Ta):friendostream

運行結果

3.程序的類結構圖為:

Shape

++AArea():virtualdouble

const

+PrintShapeName():virtualvoid

const

+Print():virtualvoid

const

Pointx,y:int+Point(int=0,int=0)

+SetPoint(inta,intb):void

+GetX():intconst

+GetY():intconst

+PointShapeName():virtualvoidconst

+Print():virtualvoidconst

Circle

rradius:double

++Circle(intx=0,inty=0,doubler=0.0)

++SetRadius(doubler):void

++GetRadius():doubleconst

++Area():virtualdoubleconst

++Print():virtualvoidconst

++PrintShapeName():virtualvoidconst

運行結果

4.程序的類結構圖為:

Shape11

#x_size,y_size:double

+Shape11(doublex,doubley)

+area():virtualdouble

+perimeter():virtualdoublee

+print():virtualvoid

相關代碼:

#includeiostream

usingnamespacestd;classShape1{

protected:

doublex_size,y_size;

public:

Shape1(doublex,doubley);

//構造函數

virtualdoublearea()

//純虛函數,在派生類中重載

{

return0.0;Circle11

#radius:double

+Circle1(doublee

x=0.0,doubley=0.0,doubler=0.0)

+set_radius(doubler=0.0):void

+get_radius():double

+area():virtualdouble

+perimeter():virtualdouble

+print():virtualvoid

Square11

#i_size,j_size:double

+Square11(doublex=0.0,doubley=0.0,

ddouble

i=0.0,doublej=0.0)

+set_i(doublei):void

+set_j(double_j):void

+get_i():void

++gget_j():void

+area():virtualdouble

+perimeter():virtualdouble

+print():virtualvoid

}

virtualdoubleperimeter()

{

return0.0;

}

virtualvoidprint()=0;};

Shape1::Shape1(doublea,doubleb){

x_size=a;

y_size=b;}

classCircle1:publicShape1{

protected:

doubleradius;

public:

Circle1(doublex=0.0,doubley=0.0,doubler=0.0);//構造函數

voidset_radius(doubler=0.0);

//設置半徑

doubleget_radius();

//輸出半徑

virtualdoublearea();

virtualdoubleperimeter();

virtualvoidprint();

//輸出圓心坐標和半徑};

Circle1::Circle1(doub

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論