




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第九章運(yùn)算符重載面向?qū)ο蟪绦蛟O(shè)計(jì)(C++)9.1什么是運(yùn)算符重載?9.1.1什么是運(yùn)算符重載?inti=10;i<<2;//這個<<是左移運(yùn)算符;cout<<“helloworld”;//這個“<<”是什么?9.1.1什么是運(yùn)算符重載?(續(xù))原型定義(Fromostream.h):inlineostream&ostream::operator<<(constunsignedchar*_s){returnoperator<<((constchar*)_s);}
cout<<“helloworld”;
cout.operator<<(“helloworld”);9.1.1什么是運(yùn)算符重載?(續(xù))運(yùn)算符重載:
是一個按特殊格式(operator@)聲明的函數(shù),從而改變了內(nèi)部運(yùn)算符@的含義。9.2運(yùn)算符重載的語法9.2.1語法typeclassname::operator@(arg_list)或typeoperator@(arg_list)函數(shù)返回值保留字被重載的運(yùn)算符形式參數(shù)函數(shù)返回值類名保留字被重載的運(yùn)算符形式參數(shù)classComplex{private:doublerpart;doubleipart;public:Complex(){rpart=ipart=0.0;}
Complex(double
rp,double
ip){
rpart=rp;ipart=ip;}Complexadd(constComplex&com){Complextemp;
temp.rpart=com.rpart+rpart;
temp.ipart=com.ipart+ipart;returntemp;}
};例1:復(fù)數(shù)相“加”(普通成員函數(shù)實(shí)現(xiàn))voidmain(){ComplexC1(2.0,3.0);ComplexC2(5.0,4.0);ComplexC3;C3=C2.add(C1);//要是能寫成C3=C1+C2就好了}classComplex{private:doublerpart;doubleipart;public:Complex(){rpart=ipart=0.0;}
Complex(double
rp,double
ip){rpart=rp;ipart=ip;}
ComplexOperator+(constComplex&com){Complextemp;
temp.rpart=com.rpart+rpart;
temp.ipart=com.ipart+ipart;returntemp;}};例2:復(fù)數(shù)相“加”(特殊成員函數(shù)/重載“+”實(shí)現(xiàn))voidmain(){ComplexC1(2.0,3.0);ComplexC2(5.0,4.0);ComplexC3;
C3=C2+C1;}C3=C2+C1;C3=C2.operator+(C1)例3:復(fù)數(shù)相“加”(重載“+”實(shí)現(xiàn)/外部函數(shù))classComplex{private:doublerpart;doubleipart;public:Complex(){
rpart=ipart=0.0;}
Complex(double
rp,double
ip){
rpart=rp;ipart=ip;}
friendComplexOperator+(constComplex&com1,constComplex&com2);};Complexoperator+(constComplex&com1,constComplex&com2){Complextemp;
temp.rpart=com1.rpart+com2.rpart;
temp.ipart=com1.ipart+com2.ipart;returntemp;}
voidmain(){ComplexC1(2.0,3.0);ComplexC2(5.0,4.0);ComplexC3;
C3=C2+C1;}C3=C2+C1C3=Operator+(C2,C1)注意形參跟內(nèi)部成員函數(shù)的區(qū)別9.2.2小結(jié)1.運(yùn)算符重載只是一種“語法上的方便”(語法糖);實(shí)質(zhì)上是另一種函數(shù)調(diào)用的方式。
C1+C2C1.operator+(C2)2.參數(shù)列表中的參數(shù)個數(shù)取決于:
1)運(yùn)算符是一元的還是二元的;
2)被定義為全局函數(shù)還是成員函數(shù);
C1+C2C1.operator+(C2)C1+C2operator+(C1,C2)
3)對單目后綴運(yùn)算符,需傳遞一個int常量(啞元常量值)C1++C1.operator++(1)++C1C1.operator++()9.2.2小結(jié)(續(xù))3.運(yùn)算符重載的限制:
1)不能改變內(nèi)部算符的優(yōu)先級、結(jié)合順序及運(yùn)算符的目數(shù);
C1+C2*C3C1+(C2*C3)C1+C2.operator*(C3)C1.operator+(C2.operator*(C3))
2).,*,::,?:,
sizeof五種運(yùn)算符不能重載。
3)重載=,[],(),->
都必須是非靜態(tài)的成員函數(shù),目的是保證它們的第一個操作數(shù)是一個自定義對象,從而阻止改變這些運(yùn)算符作用在基本數(shù)據(jù)類型上的含義的企圖。
a[];//如果調(diào)用的是重載的[],則a一定是自定
//義類型的對象9.2.3例:重載++classinteger{
inti;public:
integer(intii){i=ii;}integeroperator++(){//前綴++i++;return*this;}integeroperator++(int){//后綴++,添加一個啞元
integertemp=*this;i++;returntemp;}};voidmain(){integera(1),b(2);b=a++;b=++a;}9.3自定義類型轉(zhuǎn)換9.3.1引言問題:如何實(shí)現(xiàn)complex+double或double+complex?方法一:內(nèi)部函數(shù):complexcomplex::operator+(complex);內(nèi)部函數(shù):complexcomplex::operator+(double);外部函數(shù):complexoperator+(double,complex)方法二:轉(zhuǎn)換構(gòu)造函數(shù):T->X轉(zhuǎn)換,如:double->Complex
則定義函數(shù):complexcomplex::complex(constdouble);
9.3.2轉(zhuǎn)換構(gòu)造函數(shù)定義double->Complex的轉(zhuǎn)換,實(shí)現(xiàn):double+Complex,Complex+double,Complex+Complex:classComplex{friendint
operator+(constComplex&c1,constComplex&c2);
Complex(constdouble&d){
rpart=d;
ipart=0.0;}…};例:3.0+Complex,將3.0轉(zhuǎn)換成臨時的復(fù)數(shù)對象。9.3.3轉(zhuǎn)換運(yùn)算符定義轉(zhuǎn)換運(yùn)算符函數(shù)X::operatorT(){//…;};實(shí)現(xiàn)類X->T(通常是內(nèi)部類型)的轉(zhuǎn)換。Complex->doubledoubleComplex::operatordouble(){returnrpart;}Complexc1(5.5,1.1);doubletemp=1.0;temp=temp+c1;temp=temp+double(c1);9.3.4二義性問題若同時定義了轉(zhuǎn)換運(yùn)算符合轉(zhuǎn)換構(gòu)造函數(shù),會引起二義性。classX{
inti;public:friendXoperator+(constX&,constX&);
X(intii){i=ii;}//轉(zhuǎn)換構(gòu)造函數(shù)operatorint(){returni;}//轉(zhuǎn)換運(yùn)算符};Xoperator+(constX&,constX){returnX(x1.i+x2.i);}voidmain(){Xx1(10);
inti=x1+x2;//二義性i=12+x1;//二義性}9.3.5重載運(yùn)算符參數(shù)匹配規(guī)則1.如果正好匹配,則不必進(jìn)行轉(zhuǎn)換,或者簡單的調(diào)整(如:數(shù)組名轉(zhuǎn)為指針,函數(shù)名轉(zhuǎn)為函數(shù)指針,類型T轉(zhuǎn)為constT);2.如果不匹配,則試著將char轉(zhuǎn)為int,short轉(zhuǎn)為int,float轉(zhuǎn)為double;3.如果仍不匹配,則進(jìn)行標(biāo)準(zhǔn)轉(zhuǎn)換(例如,把int
轉(zhuǎn)為double,指向派生類的指針轉(zhuǎn)為指向基類的指針,unsignedint
轉(zhuǎn)為int)4.如果還不匹配,則使用用戶定義的轉(zhuǎn)換(包括轉(zhuǎn)換構(gòu)造函數(shù)和轉(zhuǎn)換算符).5.如果不匹配,且函數(shù)參數(shù)中有…,則用…來匹配任意參數(shù).6.否則,因類型不匹配而出錯.注:以上規(guī)則適用于所有的重載函數(shù).9.4重要應(yīng)用舉例9.4.1重載賦值運(yùn)算符classMessage{
char*buffer;
intsize;public:
Message(int
sz=256);
Message(constMessage&msg);Message&operator=(constMessage&msg);
void
setmessage(constchar*buf);
constchar*getmessage()const;
virtual~Message();};Message::Message(int
sz){size=sz; buffer=newchar[size];buffer[0]=‘\0’;}Message::~Message(){
delete[]buffer;}constchar*Message::getmessage()const{
returnbuffer;}void
Message::setmessage(const
char*buf){
strcpy(buffer,buf);}//拷貝構(gòu)造函數(shù)Message::Message(constMessage&msg){size=msg.size; buffer=new
char[size];
strcpy(buffer,msg.buffer);}Message&Message::operator=(constMessage&msg){
if(this!=&msg){
delete[]buffer;size=msg.size; buffer=new
char[size];
strcpy(buffer,msg.buffer); }
return*this;//返回*this的引用目的是實(shí)現(xiàn)鏈?zhǔn)劫x值}int
main(int
argc,char*argv[]){Messagemsg(100);
msg.setmessage("IamRick");
cout<<msg.getmessage()<<endl;Messagemsg2(msg);
cout<<msg2.getmessage()<<endl; Messagemsg3; msg3=msg2=msg;//鏈?zhǔn)劫x值
cout<<msg3.getmessage()<<endl;// strcpy(msg.getmessage(),"IamMike");error!!
return0;}Msg3.operator=(msg2.operator=(msg))什么是安全的類?如何設(shè)計(jì)一個安全的類?一個安全的類,通常須有幾個特殊的成員函數(shù):構(gòu)造函數(shù):正確初始化對象;析構(gòu)函數(shù):正確回收對象的空間;拷貝構(gòu)造函數(shù):正確實(shí)現(xiàn)用對象去初始化對象;重載賦值運(yùn)算符:正確實(shí)現(xiàn)對象間的賦值。#include<iostream.h>classMyComplex{public: doublerpart; doubleipart; staticintcount;
MyComplex(){
rpart=ipart=0.0;count++;
cout<<"生成對象:"<<this<<"初始化構(gòu)造函數(shù)"<<"rpart="<<rpart<<"Count="<<count<<endl;}
MyComplex(MyComplex&h){ ++count;
rpart=h.rpart;
ipart=h.ipart;
cout<<"生成對象:"<<this<<"拷貝構(gòu)造函數(shù)"<<"rpart="<<rpart<<"Count="<<count<<endl;} ~MyComplex(){--count;
cout<<"撤消對象:"<<this<<"析構(gòu)函數(shù)"<<"rpart="<<rpart<<"Count="<<count<<endl;}
MyComplex
operator+(const
MyComplex&com){
cout<<"進(jìn)入重載+"<<endl;
MyComplextemp;
temp.rpart=rpart+com.rpart;
temp.ipart=ipart+com.ipart; returntemp;}
MyComplex&operator=(constMyComplex&com){
cout<<"重載賦值運(yùn)算符"<<endl;
ipart=com.ipart;
rpart=com.rpart; return*this; }
MyComplex(double
rp,doubleip){
cout++;
rpart=rp;
ipart=ip;
cout<<"生成對象:"<<this<<"初始化構(gòu)造函數(shù)"<<"rpart="<<rpart<<"count="<<count<<endl;}};int
MyComplex::count=0;int
main(int
argc,char*argv[]){
MyComplexa(1,1),b(2,2),c(3,3),d(4,4);
cout<<"================================"<<endl;
MyComplex&e=c+d;
MyComplexf=d;
MyComplexg;
cout<<"================================"<<endl;g=d; return0;}9.4.2重載[]實(shí)現(xiàn)關(guān)聯(lián)數(shù)組class
Ctuition{
inttotal[5];public:
Ctuition(){total[0]=5000;//“CS”total[1]=5000;//“EE”…;}voidSetTuition(constchar*dept,intt){
inti;if(dept==“CS”)i=0;elseif(dept==“EE”)i=1;…;
total[i]=t;}
int
GetTuition(constchar*dept){if(dept==“CS”)i=0;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國半導(dǎo)體光電器件行業(yè)市場規(guī)模調(diào)研及投資前景研究分析報告
- 電商平臺限時搶購活動策劃與執(zhí)行服務(wù)協(xié)議
- 2025年中國百歲老人期貨行業(yè)市場前景預(yù)測及投資價值評估分析報告
- 2025年中國鈀合金行業(yè)市場前景預(yù)測及投資價值評估分析報告
- 虛擬現(xiàn)實(shí)影視特效制作與VR教育合作合同
- 影視拍攝現(xiàn)場群眾演員意外險及理賠程序協(xié)議
- 2025年中國奧硝唑藥物行業(yè)市場前景預(yù)測及投資價值評估分析報告
- 鄰居代兒童接送協(xié)議書
- 股權(quán)代持與公司內(nèi)部控制協(xié)議
- 重大公關(guān)事件應(yīng)對與危機(jī)管理合同
- 中國卒中腸內(nèi)營養(yǎng)護(hù)理指南2021
- 2024年中國外運(yùn)股份有限公司招聘筆試參考題庫含答案解析
- 骨化三醇口服溶液-藥品臨床應(yīng)用解讀
- 北京社區(qū)衛(wèi)生服務(wù)中心目錄
- 義務(wù)教育學(xué)校標(biāo)準(zhǔn)化建設(shè)實(shí)施方案
- 報價單模板完
- 滑模施工檢查驗(yàn)收記錄
- SCL-90癥狀自評量表
- 國家開放大學(xué)《可編程控制器應(yīng)用實(shí)訓(xùn)》形考任務(wù)5(實(shí)訓(xùn)五)參考答案
- 學(xué)生志愿服務(wù)證明模板
- 醫(yī)師手術(shù)分級授權(quán)考核表
評論
0/150
提交評論