版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章運(yùn)算符重載運(yùn)算符重載與函數(shù)重載相似,其目的是設(shè)置某一運(yùn)算符,讓它具有另一種功能,盡管此運(yùn)算符在原先C++語(yǔ)言中代表另一種含義,但它們彼此之間并不沖突。
C++會(huì)根據(jù)運(yùn)算符的位置辨別應(yīng)使用哪一種功能進(jìn)行運(yùn)算。9.1運(yùn)算符重載概述運(yùn)算符重載是對(duì)已有的運(yùn)算符賦予多重含義,同一個(gè)運(yùn)算符作用于不同類型的數(shù)據(jù)導(dǎo)致不同類型的行為。
C++中預(yù)定義的運(yùn)算符的操作對(duì)象只能是基本數(shù)據(jù)類型,實(shí)際上,對(duì)于很多用戶自定義類型(比如類),也需要有類似的運(yùn)算操作,這就提出了對(duì)運(yùn)算符進(jìn)行重新定義,賦予已有符號(hào)以新功能的要求。!~+-*&/%<<>><<=>>===!=^|&&>+=-=*=/=%=&=^=|=<<=>>=,->*->()[]=++--newdeleteC++中可以重載的運(yùn)算符C++中不可以重載的運(yùn)算符
..*::?:運(yùn)算符重載的規(guī)則如下:(1)C++中的運(yùn)算符除了少數(shù)幾個(gè)之外,全部可以重載,而且只能重載已有的這些運(yùn)算符。(2)重載之后運(yùn)算符的優(yōu)先級(jí)和結(jié)合性都不會(huì)改變。(3)運(yùn)算符重載是針對(duì)新類型數(shù)據(jù)的實(shí)際需要,對(duì)原有運(yùn)算符進(jìn)行適當(dāng)?shù)母脑?。一般?lái)講,重載的功能應(yīng)當(dāng)與原有功能相類似,不能改變?cè)\(yùn)算符的操作對(duì)象個(gè)數(shù),同時(shí)至少要有一個(gè)操作對(duì)象是自定義類型。運(yùn)算符的重載形式有兩種:重載為類的成員函數(shù)和重載為類的友元函數(shù)。運(yùn)算符重載為類的函數(shù)的語(yǔ)法格式如下:
?
格式1:使運(yùn)算符函數(shù)作為類的成員函數(shù)函數(shù)類型operator運(yùn)算符(形參表){
函數(shù)體;}
?
格式2:使運(yùn)算符函數(shù)作為類的friend函數(shù)
friend函數(shù)類型operator運(yùn)算符(形參表){
函數(shù)體;}一般來(lái)講,單目運(yùn)算符最好重載為成員函數(shù),而雙目運(yùn)算符則最好重載為友元函數(shù)。運(yùn)算符重載的主要優(yōu)點(diǎn)就是允許改變使用于系統(tǒng)內(nèi)部的運(yùn)算符的操作方式,以適應(yīng)用戶新定義類型的類似運(yùn)算。9.2重載單目運(yùn)算符在C++中,單目運(yùn)算符有++和--,它們是變量自動(dòng)增1和自動(dòng)減1的運(yùn)算符。在類中可以對(duì)這兩個(gè)單目運(yùn)算符進(jìn)行重載?!纠糠治鲆韵鲁绦虻膱?zhí)行結(jié)果。#include<iostream.h>classSample{intn;public:
Sample(inti){n=i;}operator++(){n++;}//“++”運(yùn)算符重載
voiddisplay(){cout<<"n="<<n<<endl;}};voidmain(){SampleA(5);++A;A.display();}n=6如同“++”運(yùn)算符有前綴和后綴兩種使用形式一樣?!?+”和“--”重載運(yùn)算符也有前綴和后綴兩種運(yùn)算符重載形式,以“++”重載運(yùn)算符為例,其語(yǔ)法格式如下:函數(shù)類型operator++(); //前綴運(yùn)算函數(shù)類型operator++(int); //后綴運(yùn)算使用前綴運(yùn)算符的語(yǔ)法格式如下:
++對(duì)象;使用后綴運(yùn)算符的語(yǔ)法格式如下:對(duì)象++;【例】分析以下程序的執(zhí)行結(jié)果。#include<iostream.h>classSample{intn;public:
Sample(inti){n=i;}operator++(){ n++;} //前綴運(yùn)算符
operator++(int){n+=2;} //后綴運(yùn)算符
voiddisplay(){cout<<"n="<<n<<endl;}};voidmain(){SampleA(5),B(5);A++; //調(diào)用后綴重載運(yùn)算符
++B; //調(diào)用前綴重載運(yùn)算符
A.display();B.display();}n=7n=6【例】分析以下程序的執(zhí)行結(jié)果。#include<iostream.h>classSample{intn;public:
Sample(inti){n=i;}
intoperator++() //前綴運(yùn)算符
{n++;returnn;}
intoperator++(int)//后綴運(yùn)算符
{n+=2;returnn;}};voidmain(){SampleA(5),B(5);
cout<<"n="<<A++<<endl;
cout<<"n="<<++B<<endl;}n=7n=69.3重載雙目運(yùn)算符運(yùn)算符重載實(shí)質(zhì)上就是函數(shù)重載,如果重載為成員函數(shù),它就可以自由地訪問(wèn)本類的數(shù)據(jù)成員。實(shí)際使用時(shí),總是通過(guò)該類的某個(gè)對(duì)象來(lái)訪問(wèn)重載的運(yùn)算符。對(duì)于雙目運(yùn)算符,一個(gè)運(yùn)算數(shù)是對(duì)象本身的數(shù)據(jù),由this指針給出,另一個(gè)運(yùn)算數(shù)則需要通過(guò)運(yùn)算符重載函數(shù)的參數(shù)表來(lái)傳遞。下面分別介紹這兩種情況。對(duì)于雙目運(yùn)算符B,如果要重載B為類的成員函數(shù),使之能夠?qū)崿F(xiàn)表達(dá)式“oprd1Boprd2”,其中oprd1為A類的對(duì)象,則應(yīng)當(dāng)把B重載為A類的成員函數(shù),該函數(shù)只有一個(gè)形參,形參的類型是oprd2所屬的類型。經(jīng)過(guò)重載之后,表達(dá)式oprd1Boprd2就相當(dāng)于函數(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ù)方式重載運(yùn)算符“+”{Vectortmp;//定義一個(gè)tmp對(duì)象
tmp.x=x+v.x;tmp.y=y+v.y;returntmp;//返回tmp對(duì)象
}Vectoroperator-(Vectorv)//成員函數(shù)方式重載運(yùn)算符“-”
{Vectortmp;//定義一個(gè)tmp對(duì)象
tmp.x=x-v.x;tmp.y=y-v.y;returntmp;//返回tmp對(duì)象
}
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)運(yùn)算符也可以重載為類的友元函數(shù),這樣,它就可以自由地訪問(wèn)該類的任何數(shù)據(jù)成員。這時(shí),運(yùn)算符所需要的運(yùn)算數(shù)都需要通過(guò)函數(shù)的形參表來(lái)傳遞,在參數(shù)表中形參從左到右的順序就是運(yùn)算符運(yùn)算數(shù)的順序?!纠糠治鲆韵鲁绦虻膱?zhí)行結(jié)果。#include<iostream.h>classVector{intx,y;public:Vector(){};
Vector(intx1,inty1){x=x1;y=y1;}friendVectoroperator+(Vectorv1,Vectorv2)//友元函數(shù)方式重載運(yùn)算符“+”{Vectortmp;//定義一個(gè)tmp對(duì)象
tmp.x=v1.x+v2.x;
tmp.y=v1.y+v2.y;returntmp;//返回tmp對(duì)象
}
friendVectoroperator-(Vectorv1,Vectorv2)//友元函數(shù)方式重載運(yùn)算符“-”
{Vectortmp;//定義一個(gè)tmp對(duì)象
tmp.x=v1.x-v2.x;
tmp.y=v1.y-v2.y;returntmp;//返回tmp對(duì)象
}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重載比較運(yùn)算符除了前面介紹的單目運(yùn)算符和雙目運(yùn)算符重載外,也可以設(shè)計(jì)比較運(yùn)算符(如>、<或==)的重載函數(shù)。比較運(yùn)算符重載函數(shù)必須返回真(非0)或假(0)。
【例】編寫一個(gè)程序,測(cè)試輸入的長(zhǎng)度能否構(gòu)成一個(gè)三角形。解:構(gòu)成三角形的條件是任意兩邊之和大于第三邊。#include<iostream.h>classLine{int
len;public:
Line(intn){len=n;}Lineoperator+(Linel) //“+”運(yùn)算符重載
{intx=len+l.len;returnLine(x);}
booloperator>(Linel) //“>”運(yùn)算符重載
{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)成一個(gè)三角形"<<endl;else
cout<<"不能夠構(gòu)成一個(gè)三角形"<<endl;}能夠構(gòu)成一個(gè)三角形9.5重載賦值運(yùn)算符在C++中有兩種類型的賦值運(yùn)算符:一類是“+=”和“-=”等先計(jì)算后賦值的運(yùn)算符,另一類是“=”即直接賦值的運(yùn)算符。下面分別進(jìn)行討論。9.5.1重載運(yùn)算符“+=”和“-=”
對(duì)于標(biāo)準(zhǔn)數(shù)據(jù)類型,“+=”和“-=”的作用是將一個(gè)數(shù)據(jù)與另一個(gè)數(shù)據(jù)進(jìn)行加法或減法運(yùn)算后再將結(jié)果回送給賦值號(hào)左邊的變量中。對(duì)它們重載后,使其實(shí)現(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ù)方式實(shí)現(xiàn)
}Vectoroperator-=(Vectorv) {Vectortmp; //定義一個(gè)tmp對(duì)象
tmp.x=x-v.x;tmp.y=y-v.y;returntmp; //返回tmp對(duì)象
}voiddisplay(){cout<<"("<<x<<","<<y<<")"<<endl;}};友元函數(shù)方式實(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重載運(yùn)算符“=”
賦值運(yùn)算符“=”的原有含義是將賦值號(hào)右邊表達(dá)式的結(jié)果拷貝給賦值號(hào)左邊的變量。通過(guò)運(yùn)算符“=”的重載將賦值號(hào)右邊對(duì)象的私有數(shù)據(jù)依次復(fù)制到賦值號(hào)左邊對(duì)象的私有數(shù)據(jù)中。在正常情況下,系統(tǒng)會(huì)為每一個(gè)類自動(dòng)生成一個(gè)默認(rèn)的完成上述功能的賦值運(yùn)算符,當(dāng)然,這種賦值只限于由同一個(gè)類類型說(shuō)明的對(duì)象之間賦值?!纠糠治鲆韵鲁绦虻膱?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í)行賦值語(yǔ)句之前:"<<endl;
cout<<"inst1*p=";inst1.disp();
cout<<"inst2*p=";inst2.disp();
cout<<"執(zhí)行賦值語(yǔ)句之后:"<<endl;inst2=inst1;
cout<<"inst1*p=";inst1.disp();
cout<<"inst2*p=";inst2.disp();}執(zhí)行賦值語(yǔ)句之前:inst1*p=firstobjectinst2*p=secondobject
執(zhí)行賦值語(yǔ)句之后:inst1*p=firstobjectinst2*p=firstobject9.6重載下標(biāo)運(yùn)算符下標(biāo)運(yùn)算符“[]”通常用于取數(shù)組的某個(gè)元素,下標(biāo)運(yùn)算符重載可以實(shí)現(xiàn)數(shù)組下標(biāo)的越界檢測(cè)等。下標(biāo)運(yùn)算符重載函數(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) //下標(biāo)運(yùn)算符重載的成員函數(shù)
{if(n>len-1) //數(shù)組超界判斷
{cout<<"數(shù)組下標(biāo)超界";return''; //返回一個(gè)特殊字符
}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ù)組下標(biāo)超界9.7重載運(yùn)算符new與deleteC++提供了new與delete兩個(gè)運(yùn)算符用于內(nèi)存管理,在大多數(shù)情況下,它們是非常有效的。但有些情況下我們需要自已管理內(nèi)存,以克服new與delete的不足。這就要重載運(yùn)算符new與delete,使其按照要求完成對(duì)內(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運(yùn)算符成員函數(shù)
{cout<<"重載new運(yùn)算符分配內(nèi)存"<<endl;returnmalloc(size);}voidoperatordelete(void*p)//重載delete運(yùn)算符成員函數(shù)
{free(p);
cout<<"重載delete運(yùn)算符釋放內(nèi)存"<<endl;}};voidmain(){
Rect*p; //定義對(duì)象指針
p=newRect(5,9); //對(duì)象指針p指向一個(gè)無(wú)名對(duì)象
p->disp();deletep;}重載new運(yùn)算符分配內(nèi)存面積:45重載delete運(yùn)算符釋放內(nèi)存9.8重載逗號(hào)運(yùn)算符逗號(hào)運(yùn)算符是雙目運(yùn)算符,和其他運(yùn)算符一樣,我們也可以通過(guò)重載逗號(hào)運(yùn)算符來(lái)完成期望完成的工作。逗號(hào)運(yùn)算符構(gòu)成的表達(dá)式為“左運(yùn)算數(shù),右運(yùn)算數(shù)”,該表達(dá)式返回右運(yùn)算數(shù)的值。如果用類的成員函數(shù)來(lái)重載逗號(hào)運(yùn)算符,則只帶一個(gè)右運(yùn)算數(shù),而左運(yùn)算數(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)//逗號(hào)運(yùn)算符重載成員函數(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)換運(yùn)算符
C++中提供了標(biāo)準(zhǔn)類型的相互轉(zhuǎn)換,如執(zhí)行語(yǔ)句:
n=(int)1.87;
則n=1。同樣,我們可以進(jìn)行這種類型轉(zhuǎn)換運(yùn)算符重載。這種重載運(yùn)算符函數(shù)的格式如下:
operator類型名(){
函數(shù)體;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度車貸抵押貸款續(xù)貸服務(wù)合同3篇
- 2025年浙科版八年級(jí)生物下冊(cè)階段測(cè)試試卷含答案
- 二零二五年度航空航天燃料采購(gòu)合同要素及燃燒效率3篇
- 2025年統(tǒng)編版2024七年級(jí)物理下冊(cè)月考試卷
- 2025年外研銜接版選擇性必修1物理下冊(cè)階段測(cè)試試卷
- 2025年浙科版高一地理下冊(cè)月考試卷含答案
- 2025年統(tǒng)編版2024選修5歷史下冊(cè)階段測(cè)試試卷
- 2025年度個(gè)人自用住房產(chǎn)權(quán)轉(zhuǎn)讓合同范本2篇
- 二零二五年度智慧城市建設(shè)戰(zhàn)略合作合同范本3篇
- 二零二五年度戶外廣告照明設(shè)計(jì)施工合同3篇
- 2024年廣州市高三一模普通高中畢業(yè)班高三綜合測(cè)試一 物理試卷(含答案)
- 部編版《道德與法治》六年級(jí)下冊(cè)教材分析萬(wàn)永霞
- 粘液腺肺癌病理報(bào)告
- 酒店人防管理制度
- 油田酸化工藝技術(shù)
- 上海高考英語(yǔ)詞匯手冊(cè)列表
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(yíng)(吳洪貴)任務(wù)五 其他內(nèi)容類型的生產(chǎn)
- 上海石油化工股份有限公司6181乙二醇裝置爆炸事故調(diào)查報(bào)告
- 例說(shuō)相機(jī)誘導(dǎo)在語(yǔ)文教學(xué)中的運(yùn)用 相機(jī)誘導(dǎo)
- 浙江省紹興市2023年中考科學(xué)試題(word版-含答案)
- 《核心素養(yǎng)下初中足球教學(xué)研究3700字(論文)》
評(píng)論
0/150
提交評(píng)論