版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第9章運算符重載運算符重載與函數(shù)重載相似,其目的是設置某一運算符,讓它具有另一種功能,盡管此運算符在原先C++語言中代表另一種含義,但它們彼此之間并不沖突。
C++會根據(jù)運算符的位置辨別應使用哪一種功能進行運算。9.1運算符重載概述運算符重載是對已有的運算符賦予多重含義,同一個運算符作用于不同類型的數(shù)據(jù)導致不同類型的行為。
C++中預定義的運算符的操作對象只能是基本數(shù)據(jù)類型,實際上,對于很多用戶自定義類型(比如類),也需要有類似的運算操作,這就提出了對運算符進行重新定義,賦予已有符號以新功能的要求。!~+-*&/%<<>><<=>>===!=^|&&>+=-=*=/=%=&=^=|=<<=>>=,->*->()[]=++--newdeleteC++中可以重載的運算符C++中不可以重載的運算符
..*::?:運算符重載的規(guī)則如下:(1)C++中的運算符除了少數(shù)幾個之外,全部可以重載,而且只能重載已有的這些運算符。(2)重載之后運算符的優(yōu)先級和結(jié)合性都不會改變。(3)運算符重載是針對新類型數(shù)據(jù)的實際需要,對原有運算符進行適當?shù)母脑臁R话銇碇v,重載的功能應當與原有功能相類似,不能改變原運算符的操作對象個數(shù),同時至少要有一個操作對象是自定義類型。運算符的重載形式有兩種:重載為類的成員函數(shù)和重載為類的友元函數(shù)。運算符重載為類的函數(shù)的語法格式如下:
?
格式1:使運算符函數(shù)作為類的成員函數(shù)函數(shù)類型operator運算符(形參表){
函數(shù)體;}
?
格式2:使運算符函數(shù)作為類的friend函數(shù)
friend函數(shù)類型operator運算符(形參表){
函數(shù)體;}一般來講,單目運算符最好重載為成員函數(shù),而雙目運算符則最好重載為友元函數(shù)。運算符重載的主要優(yōu)點就是允許改變使用于系統(tǒng)內(nèi)部的運算符的操作方式,以適應用戶新定義類型的類似運算。9.2重載單目運算符在C++中,單目運算符有++和--,它們是變量自動增1和自動減1的運算符。在類中可以對這兩個單目運算符進行重載?!纠糠治鲆韵鲁绦虻膱?zhí)行結(jié)果。#include<iostream.h>classSample{intn;public:
Sample(inti){n=i;}operator++(){n++;}//“++”運算符重載
voiddisplay(){cout<<"n="<<n<<endl;}};voidmain(){SampleA(5);++A;A.display();}n=6如同“++”運算符有前綴和后綴兩種使用形式一樣。“++”和“--”重載運算符也有前綴和后綴兩種運算符重載形式,以“++”重載運算符為例,其語法格式如下:函數(shù)類型operator++(); //前綴運算函數(shù)類型operator++(int); //后綴運算使用前綴運算符的語法格式如下:
++對象;使用后綴運算符的語法格式如下:對象++;【例】分析以下程序的執(zhí)行結(jié)果。#include<iostream.h>classSample{intn;public:
Sample(inti){n=i;}operator++(){ n++;} //前綴運算符
operator++(int){n+=2;} //后綴運算符
voiddisplay(){cout<<"n="<<n<<endl;}};voidmain(){SampleA(5),B(5);A++; //調(diào)用后綴重載運算符
++B; //調(diào)用前綴重載運算符
A.display();B.display();}n=7n=6【例】分析以下程序的執(zhí)行結(jié)果。#include<iostream.h>classSample{intn;public:
Sample(inti){n=i;}
intoperator++() //前綴運算符
{n++;returnn;}
intoperator++(int)//后綴運算符
{n+=2;returnn;}};voidmain(){SampleA(5),B(5);
cout<<"n="<<A++<<endl;
cout<<"n="<<++B<<endl;}n=7n=69.3重載雙目運算符運算符重載實質(zhì)上就是函數(shù)重載,如果重載為成員函數(shù),它就可以自由地訪問本類的數(shù)據(jù)成員。實際使用時,總是通過該類的某個對象來訪問重載的運算符。對于雙目運算符,一個運算數(shù)是對象本身的數(shù)據(jù),由this指針給出,另一個運算數(shù)則需要通過運算符重載函數(shù)的參數(shù)表來傳遞。下面分別介紹這兩種情況。對于雙目運算符B,如果要重載B為類的成員函數(shù),使之能夠?qū)崿F(xiàn)表達式“oprd1Boprd2”,其中oprd1為A類的對象,則應當把B重載為A類的成員函數(shù),該函數(shù)只有一個形參,形參的類型是oprd2所屬的類型。經(jīng)過重載之后,表達式oprd1Boprd2就相當于函數(shù)調(diào)用“oprd1.operatorB(oprd2)”?!纠糠治鲆韵鲁绦虻膱?zhí)行結(jié)果。#include<iostream.h>classVector{intx,y;public:Vector(){};
Vector(intx1,inty1){x=x1;y=y1;}Vectoroperator+(Vectorv)//成員函數(shù)方式重載運算符“+”{Vectortmp;//定義一個tmp對象
tmp.x=x+v.x;tmp.y=y+v.y;returntmp;//返回tmp對象
}Vectoroperator-(Vectorv)//成員函數(shù)方式重載運算符“-”
{Vectortmp;//定義一個tmp對象
tmp.x=x-v.x;tmp.y=y-v.y;returntmp;//返回tmp對象
}
voiddisplay(){cout<<"("<<x<<","<<y<<")"<<endl;}};voidmain(){Vectorv1(6,8),v2(3,6),v3,v4;
cout<<"v1=";v1.display();
cout<<"v2=";v2.display();v3=v1+v2;
cout<<"v1+v2=";v3.display();v4=v1-v2;
cout<<"v1-v2=";v4.display();}v1=(6,8)v2=(3,6)v1+v2=(9,14)v1-v2=(3,2)運算符也可以重載為類的友元函數(shù),這樣,它就可以自由地訪問該類的任何數(shù)據(jù)成員。這時,運算符所需要的運算數(shù)都需要通過函數(shù)的形參表來傳遞,在參數(shù)表中形參從左到右的順序就是運算符運算數(shù)的順序?!纠糠治鲆韵鲁绦虻膱?zhí)行結(jié)果。#include<iostream.h>classVector{intx,y;public:Vector(){};
Vector(intx1,inty1){x=x1;y=y1;}friendVectoroperator+(Vectorv1,Vectorv2)//友元函數(shù)方式重載運算符“+”{Vectortmp;//定義一個tmp對象
tmp.x=v1.x+v2.x;
tmp.y=v1.y+v2.y;returntmp;//返回tmp對象
}
friendVectoroperator-(Vectorv1,Vectorv2)//友元函數(shù)方式重載運算符“-”
{Vectortmp;//定義一個tmp對象
tmp.x=v1.x-v2.x;
tmp.y=v1.y-v2.y;returntmp;//返回tmp對象
}voiddisplay(){cout<<"("<<x<<","<<y<<")"<<endl;}};voidmain(){Vectorv1(6,8),v2(3,6),v3,v4;
cout<<"v1=";v1.display();
cout<<"v2=";v2.display();v3=v1+v2;
cout<<"v1+v2=";v3.display();v4=v1-V2;
cout<<"v1-v2=";v4.display();}v1=(6,8)v2=(3,6)v1+v2=(9,14)v1-v2=(3,2)9.4重載比較運算符除了前面介紹的單目運算符和雙目運算符重載外,也可以設計比較運算符(如>、<或==)的重載函數(shù)。比較運算符重載函數(shù)必須返回真(非0)或假(0)。
【例】編寫一個程序,測試輸入的長度能否構(gòu)成一個三角形。解:構(gòu)成三角形的條件是任意兩邊之和大于第三邊。#include<iostream.h>classLine{int
len;public:
Line(intn){len=n;}Lineoperator+(Linel) //“+”運算符重載
{intx=len+l.len;returnLine(x);}
booloperator>(Linel) //“>”運算符重載
{return(len>l.len)?1:0;}};voidmain(){Linea(10),b(5),c(14);if((a+b>c)&&(a+c>b)&&(b+c>a))
cout<<"能夠構(gòu)成一個三角形"<<endl;else
cout<<"不能夠構(gòu)成一個三角形"<<endl;}能夠構(gòu)成一個三角形9.5重載賦值運算符在C++中有兩種類型的賦值運算符:一類是“+=”和“-=”等先計算后賦值的運算符,另一類是“=”即直接賦值的運算符。下面分別進行討論。9.5.1重載運算符“+=”和“-=”
對于標準數(shù)據(jù)類型,“+=”和“-=”的作用是將一個數(shù)據(jù)與另一個數(shù)據(jù)進行加法或減法運算后再將結(jié)果回送給賦值號左邊的變量中。對它們重載后,使其實現(xiàn)其他相關(guān)的功能?!纠糠治鲆韵鲁绦虻膱?zhí)行結(jié)果。#include<iostream.h>classVector{intx,y;public:Vector(){};
Vector(intx1,inty1){x=x1;y=y1;}friendVectoroperator+=(Vectorv1,Vectorv2) {v1.x+=v2.x;v1.y+=v2.y;returnv1;成員函數(shù)方式實現(xiàn)
}Vectoroperator-=(Vectorv) {Vectortmp; //定義一個tmp對象
tmp.x=x-v.x;tmp.y=y-v.y;returntmp; //返回tmp對象
}voiddisplay(){cout<<"("<<x<<","<<y<<")"<<endl;}};友元函數(shù)方式實現(xiàn)voidmain(){Vectorv1(6,8),v2(3,6),v3,v4;
cout<<"v1=";v1.display();
cout<<"v2=";v2.display();v3=v1+=v2;
cout<<"v3=v1+=v2后,v3=";v3.display();v4=v1-=v2;
cout<<"v4=v1-v2后,v4=";v4.display();}v1=(6,8)v2=(3,6)v3=v1+=v2后,v3=(9,14)v4=v1-v2后,v4=(3,2)9.5.2重載運算符“=”
賦值運算符“=”的原有含義是將賦值號右邊表達式的結(jié)果拷貝給賦值號左邊的變量。通過運算符“=”的重載將賦值號右邊對象的私有數(shù)據(jù)依次復制到賦值號左邊對象的私有數(shù)據(jù)中。在正常情況下,系統(tǒng)會為每一個類自動生成一個默認的完成上述功能的賦值運算符,當然,這種賦值只限于由同一個類類型說明的對象之間賦值?!纠糠治鲆韵鲁绦虻膱?zhí)行結(jié)果。#include<iostream.h>#include<string.h>classSample{char*p;public:Sample(char*pn){p=newchar[strlen(pn)+1];
strcpy(p,pn);}~Sample(){deletep;} Sample&operator=(Sample&s)//“=”重載成員函數(shù)
{deletep;p=newchar[strlen(s.p)+1];
strcpy(p,s.p);return*this;}voiddisp(){cout<<p<<endl;}};voidmain(){Sampleinst1("firstobject");Sampleinst2("secondobject");
cout<<"執(zhí)行賦值語句之前:"<<endl;
cout<<"inst1*p=";inst1.disp();
cout<<"inst2*p=";inst2.disp();
cout<<"執(zhí)行賦值語句之后:"<<endl;inst2=inst1;
cout<<"inst1*p=";inst1.disp();
cout<<"inst2*p=";inst2.disp();}執(zhí)行賦值語句之前:inst1*p=firstobjectinst2*p=secondobject
執(zhí)行賦值語句之后:inst1*p=firstobjectinst2*p=firstobject9.6重載下標運算符下標運算符“[]”通常用于取數(shù)組的某個元素,下標運算符重載可以實現(xiàn)數(shù)組下標的越界檢測等。下標運算符重載函數(shù)只能作為類的成員函數(shù),不能作為類的友元函數(shù)?!纠糠治鲆韵鲁绦虻膱?zhí)行結(jié)果。#include<iostream.h>#include<string.h>classwords{int
len;char*str;public:words(char*s){str=newchar[strlen(s)+1];strcpy(str,s);
len=strlen(s);}charoperator[](intn) //下標運算符重載的成員函數(shù)
{if(n>len-1) //數(shù)組超界判斷
{cout<<"數(shù)組下標超界";return''; //返回一個特殊字符
}elsereturn*(str+n);}voiddisp(){cout<<str<<endl;}};voidmain(){wordsword("ThisisC++Book");
word.disp();
cout<<"位置0:";
cout<<word[0]<<endl;//顯示'T'
cout<<"位置15:";
cout<<word[15]<<endl;//顯示'k'
cout<<"位置25:";
cout<<word[25]<<endl;//超界}
ThisisC++Book
位置0:T
位置15:k
位置25:數(shù)組下標超界9.7重載運算符new與deleteC++提供了new與delete兩個運算符用于內(nèi)存管理,在大多數(shù)情況下,它們是非常有效的。但有些情況下我們需要自已管理內(nèi)存,以克服new與delete的不足。這就要重載運算符new與delete,使其按照要求完成對內(nèi)存的管理。【例】分析以下程序的執(zhí)行結(jié)果。#include<iostream.h>#include<malloc.h>classRect{intlength,width;public:
Rect(int
l,intw){length=l;width=w;}voiddisp(){cout<<"面積:"<<length*width<<endl;}void*operatornew(size_tsize)//重載new運算符成員函數(shù)
{cout<<"重載new運算符分配內(nèi)存"<<endl;returnmalloc(size);}voidoperatordelete(void*p)//重載delete運算符成員函數(shù)
{free(p);
cout<<"重載delete運算符釋放內(nèi)存"<<endl;}};voidmain(){
Rect*p; //定義對象指針
p=newRect(5,9); //對象指針p指向一個無名對象
p->disp();deletep;}重載new運算符分配內(nèi)存面積:45重載delete運算符釋放內(nèi)存9.8重載逗號運算符逗號運算符是雙目運算符,和其他運算符一樣,我們也可以通過重載逗號運算符來完成期望完成的工作。逗號運算符構(gòu)成的表達式為“左運算數(shù),右運算數(shù)”,該表達式返回右運算數(shù)的值。如果用類的成員函數(shù)來重載逗號運算符,則只帶一個右運算數(shù),而左運算數(shù)由指針this提供。【例】分析以下程序的執(zhí)行結(jié)果。#include<iostream.h>#include<malloc.h>classPoint{intx,y;public:Point(){};
Point(int
l,intw){x=l;y=w;}voiddisp(){cout<<"面積:"<<x*y<<endl;}Pointoperator,(Pointr)//逗號運算符重載成員函數(shù)
{Pointtemp;temp.x=r.x;temp.y=r.y;returntemp;}Pointoperator+(Pointr){Pointtemp;temp.x=r.x+x;temp.y=r.y+y;returntemp;}};voidmain(){Pointr1(3,3),r2(5,8),r3(2,4);r1.disp();r2.disp();r3.disp();r1=(r1,r2+r3,r3);r1.disp();}面積:9面積:40面積:8面積:89.9重載類型轉(zhuǎn)換運算符
C++中提供了標準類型的相互轉(zhuǎn)換,如執(zhí)行語句:
n=(int)1.87;
則n=1。同樣,我們可以進行這種類型轉(zhuǎn)換運算符重載。這種重載運算符函數(shù)的格式如下:
operator類型名(){
函數(shù)體;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工離職協(xié)議模板
- 配電室維護協(xié)議書
- 權(quán)威加工合同范文合輯
- 大學新生入學法律協(xié)議范文
- 全面服裝代理合同范本
- 消防工程專業(yè)承包合同
- 廣告位承包協(xié)議范本
- 美術(shù)作品購買協(xié)議范本2024年
- 個人稅收居民證明委托申請
- 準合同補充協(xié)議范本2024年
- 6.3∕ 8.1∕ 8.5.6-質(zhì)量管理體系要求-“質(zhì)量管理體系與運行(生產(chǎn)服務提供)變更管理”條文理解與實施指導材料(雷澤佳編制-2023)
- 王戎不取道旁李-“江南聯(lián)賽”一等獎
- 學校田徑運動會所需各表格(團體總分記錄表-徑賽檢錄表-徑賽計時表-終點名次報告表-田賽遠度表)等
- 2023年國開大學期末考復習題-02316-中級財務會計(一)
- 【護理學個案護理論文:一例潰瘍性結(jié)腸炎患者的護理5600字】
- 教育政策與法規(guī)全套完整教學課件
- GPS測量與數(shù)據(jù)處理完整整套教學課件
- 護士讀書分享《喚醒護理》
- 高標準農(nóng)田灌溉與排水工程施工方案
- 《觀察葉片的結(jié)構(gòu)》 說課課件
- 醫(yī)院透析患者安全管理應急預案
評論
0/150
提交評論