




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
本文格式為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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權】 IEC 60350-2:2025 RLV EN Household electric cooking appliances - Part 2: Hobs - Methods for measuring performance
- 2025至2030中國男茄克行業發展分析及競爭格局與發展趨勢預測報告
- 2025至2030中國電子出版物行業深度研究及發展前景投資評估分析
- 2025至2030中國甲硝唑片行業產業運行態勢及投資規劃深度研究報告
- 《醫療機構工作人員廉潔從業九項準則》考核試卷(含答案)
- 茶藝知識培訓課件
- 農林高校研究生課程思政建設評價研究
- 技術助力下的翻轉課堂教學相長的實踐案例
- 郵電系統培訓課件資源
- 2025年中國PU球場數據監測研究報告
- SEO與用戶體驗設計在醫療安全產品中的應用
- DB51T 2628-2019 司法所外觀及室內標識規范
- 廣西大學《電機學》期末復習題及參考答案
- 2024年度破碎機生產原料供應與采購合同
- 外賣配送人員勞動合同
- 《義務教育數學課程標準(2022年版)》初中內容解讀
- 精神疾病患者的麻醉管理
- 高一物理競賽試題及答案
- 醫院預約平臺建設方案
- 生命體征課件教學課件
- 《烏魯木齊市國土空間總體規劃(2021-2035年)》
評論
0/150
提交評論