第10章運(yùn)算符重載講_第1頁
第10章運(yùn)算符重載講_第2頁
第10章運(yùn)算符重載講_第3頁
第10章運(yùn)算符重載講_第4頁
第10章運(yùn)算符重載講_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

算術(shù)運(yùn)算符:加(+)、減strings1,s2;//s1,s2為字符串對(duì)象s1+s2//?Complexa,b;//復(fù)數(shù)類對(duì)象a+b//???a-b//???x+y//x,y為int,float,double,char….問題引出:運(yùn)算符重載問題引出:自定義類型的運(yùn)算#include<iostream.h>classComplex{public: Complex(doublert=0,doubleit=0){r=rt;i=it;} voiddisp(); Complexadd(Complex&); Complexdec(Complex&);private: doubler,i;};voidComplex::disp(){if(i>0)cout<<r<<"+"<<i<<"i"<<endl;elseif(i<0)cout<<r<<i<<"i"<<endl;elsecout<<r<<endl;}ComplexComplex::add(Complex&t){ doublert=r+t.r; doubleit=i+t.i; returnComplex(rt,it); }ComplexComplex::dec(Complex&t){ returnComplex(r-t.r,i-t.i);}voidmain(){ Complexa(10,10),b(15,15),c; a.disp(); b.disp(); c=a.add(b); c.disp(); c=a.dec(b); c.disp();}10+10i15+15i25+25i-5-5ic=a+b;c=a-b;#include<iostream.h>classComplex{public: Complex(doublert=0,doubleit=0){r=rt;i=it;} voiddisp(); Complexoperator+(Complex&); Complexoperator-(Complex&);private: doubler,i;};voidComplex::disp(){if(i>0)cout<<r<<"+"<<i<<"i"<<endl;elseif(i<0)cout<<r<<i<<"i"<<endl;elsecout<<r<<endl;}ComplexComplex::operator+(Complex&t){ doublert=r+t.r; doubleit=i+t.i; returnComplex(rt,it); }ComplexComplex::operator-(Complex&t){ returnComplex(r-t.r,i-t.i);}voidmain(){ Complexa(10,10),b(15,15),c; a.disp(); b.disp(); c=a+b; c.disp(); c=a-b; c.disp();}編譯器將其解釋為函數(shù)調(diào)用:c=a.operator+(b);c=a.operator-(b);定義了兩個(gè)重載運(yùn)算符的成員函數(shù),它們的名字是:operator+operator–#include<iostream.h>classCPoint{public: CPoint(intxx=0,intyy=0) { x=xx; y=yy; } voiddisp() { cout<<"("<<x<<','<<y<<")"<<endl; } CPointoperator+(CPoint&q) { returnCPoint(x+q.x,y+q.y); } CPointoperator-(CPoint&q) { returnCPoint(x-q.x,y-q.y); }private: intx,y;}; 定義了兩個(gè)重載運(yùn)算符的成員函數(shù),它們的名字是:operator+operator–voidmain(){

CPointa(10,10),b(15,15),c;

a.disp();b.disp();c=a+b;//c=a.operator+(b);c.disp();c=a-b;//c=a.operator-(b);c.disp();

a=a+a;//a=a.operator+(a);

a.disp();}對(duì)表達(dá)式a+b、a-b,編譯器將其解釋為函數(shù)調(diào)用:

a.operator+(b);a.operator–(b);運(yùn)算符重載C++提供了運(yùn)算符重載的機(jī)制,程序員可對(duì)自定義的數(shù)據(jù)類型使用C++本身提供的標(biāo)準(zhǔn)運(yùn)算符進(jìn)行運(yùn)算,運(yùn)算的實(shí)現(xiàn)由重載運(yùn)算符的特殊函數(shù)來完成。這些函數(shù)有特殊的函數(shù)名(operator+),可使用運(yùn)算符方式進(jìn)行調(diào)用,也可以使用傳統(tǒng)的函數(shù)調(diào)用方式進(jìn)行調(diào)用。運(yùn)算符重載:賦予已有的運(yùn)算符多重含義,如運(yùn)算符“>>”既作為流的插入運(yùn)算符,又作為移位運(yùn)算符,根據(jù)其操作對(duì)象的不同,執(zhí)行其不同的功能。在c++中,允許對(duì)大多數(shù)的運(yùn)算符進(jìn)行重載,通過定義重載運(yùn)算符的函數(shù)使它能夠用于特定類的對(duì)象。運(yùn)算符重載的實(shí)現(xiàn)運(yùn)算符重載實(shí)際上是將運(yùn)算符重載為一個(gè)函數(shù),在重載某個(gè)運(yùn)算符時(shí),實(shí)際上就是定義一個(gè)重載運(yùn)算符的函數(shù),函數(shù)名為operator運(yùn)算符。在執(zhí)行被重載的運(yùn)算符時(shí),系統(tǒng)自動(dòng)調(diào)用該函數(shù)以實(shí)現(xiàn)相應(yīng)的運(yùn)算對(duì)表達(dá)式a+b、a–b,編譯器將其解釋為函數(shù)調(diào)用:

a.operator+(b); a.operator–(b);運(yùn)算符重載是通過定義函數(shù)實(shí)現(xiàn)的,運(yùn)算符重載實(shí)質(zhì)上是函數(shù)的重載(遵循函數(shù)重載的原則)。對(duì)于重載的運(yùn)算符可以使用運(yùn)算符方式調(diào)用,也可以使用函數(shù)調(diào)用方式調(diào)用。ComplexComplex::operator+(Complex&t){ returnComplex(r+t.r,i+t.i); }ComplexComplex::operator-(Complex&t){ returnComplex(r-t.r,i-t.i);}重載運(yùn)算符的函數(shù)的定義形式[friend]返回類型[類名::]operator

重載的運(yùn)算符(參數(shù)列表){

相關(guān)操作;}參數(shù)的個(gè)數(shù)由以下兩個(gè)因素決定:1操作符是單目還是雙目運(yùn)算符2定義為友元函數(shù)還是成員函數(shù)友元函數(shù)成員函數(shù)單目運(yùn)算符1個(gè)參數(shù)0個(gè)參數(shù)雙目運(yùn)算符2個(gè)參數(shù)1個(gè)參數(shù)在C++中提供了兩種形式的運(yùn)算符重載,即重載為:成員函數(shù)、友元函數(shù)如果是友元函數(shù),那么對(duì)于單目運(yùn)算符,它的參數(shù)個(gè)數(shù)就是1個(gè),雙目運(yùn)算符的參數(shù)個(gè)數(shù)是2個(gè);如果是成員函數(shù),那么對(duì)于單目運(yùn)算符的參數(shù)個(gè)數(shù)為0,雙目運(yùn)算符的參數(shù)個(gè)數(shù)是1個(gè)(這是由于該類本身也作為一個(gè)操作數(shù)參與計(jì)算)。一、重載為類的成員函數(shù)類中的函數(shù)原型聲明:返回類型operator

重載的運(yùn)算符(參數(shù)類型列表);程序中出現(xiàn)(以雙目運(yùn)算符為例)C1運(yùn)算符C2C1.

operator運(yùn)算符(C2)編譯程序解釋為函數(shù)調(diào)用:其中,C1和C2是類的對(duì)象,operator運(yùn)算符則是運(yùn)算符重載函數(shù)名。1、雙目運(yùn)算重載為成員函數(shù)定義形式:返回類型[類名::]operator重載的運(yùn)算符(參數(shù)列表){

相關(guān)操作;}對(duì)表達(dá)式a+b、a–c,編譯器將其解釋為函數(shù)調(diào)用:

a.operator+(b); a.operator–(c);ComplexComplex::operator+(Complex&t){ returnComplex(r+t.r,i+t.i); }ComplexComplex::operator-(Complex&t){ returnComplex(r-t.r,i-t.i);}Complexoperator+(Complex&t);Complexoperator-(Complex&t);#include<iostream.h>classComplex{public: Complex(doublea=0,doubleb=0) { r=a,i=b; } voiddisp() { if(i>0)cout<<r<<"+"<<i<<"i\n"; elseif(i<0) cout<<r<<i<<"i\n"; else cout<<r<<endl; } Complexoperator+(Complex&b) { returnComplex(r+b.r,i+b.i);} Complexoperator-(Complex&b) { returnComplex(r-b.r,i-b.i);} Complexoperator+=(Complex&b) { r+=b.r; i+=b.i; return*this;}private: doubler,i;};voidmain(){ Complexa(2,3),b(4,5); Complexc(a+b); a.disp(); b.disp(); c.disp(); c=a-b; c.disp(); a+=c; a.disp();}復(fù)數(shù)的運(yùn)算符重載(成員函數(shù))2+3i4+5i6+8i-2-2i0+1ia.operator+(b)a.operator-(b)a.operator+=(c)#include<iostream.h>#include<string.h>classstring{public: string(constchar*); string(string&s); ~string(); intstrlength(); voiddisp(); stringoperator=(string&sp); stringoperator+(string&sp); intstrcomp(string&sp); intoperator>(string&sp);private: char*pstr; intlength;};string::string(constchar*sp){ length=strlen(sp); pstr=newchar[length+1]; strcpy(pstr,sp);}string::string(string&sp){ length=sp.length; pstr=newchar[length+1]; strcpy(pstr,sp.pstr);}string::~string(){ delete[]pstr;}intstring::strlength(){ returnlength;}voidstring::disp(){ cout<<pstr<<endl;}字符串的運(yùn)算符重載(成員函數(shù))stringstring::operator=(string&sp){ length=sp.length; delete[]pstr; pstr=newchar[length+1]; strcpy(pstr,sp.pstr); return*this;}stringstring::operator+(string&sp) { char*s=newchar[length+sp.length+1]; strcpy(s,pstr); strcat(s,sp.pstr); stringt(s); delete[]s; returnt;}intstring::strcomp(string&sp){ intcmp=strcmp(pstr,sp.pstr); returncmp;}intstring::operator>(string&sp){ if(strcomp(sp)>0) return1; else return0;}voidmain(){ strings1("1234567890"),s2("abcdefg"); s1.disp(); s2.disp(); intk=s1>s2; cout<<k<<endl; k=s2>s1; cout<<k<<endl;

s1=s1+s2;

s1.disp(); s1=s2; s1.disp();}s1.operator=(s1.operator+(s2))s1.operator=(s2)注意關(guān)于“=”賦值運(yùn)算:C++允許同類對(duì)象間的賦值,將其對(duì)應(yīng)的數(shù)據(jù)成員賦值;如果在構(gòu)造函數(shù)中有資源申請(qǐng),則不能使用系統(tǒng)的賦值方式,而必須重載賦值運(yùn)算符,如string類;沒有資源分配,可不重載賦值運(yùn)算符,如Complex類。不能自造運(yùn)算符:如字符串的比較函數(shù),沒有相應(yīng)的運(yùn)算符,不能用戶自己定義。classComplex{public:Complex(doubler=0,doublei=0);voidShow();Complexoperator-();//對(duì)單目負(fù)號(hào)重載private:doubler,i;};ComplexComplex::operator-()//對(duì)單目負(fù)號(hào)重載//第一個(gè)Complex為函數(shù)返回值類型,第二個(gè)Complex為類名{returnComplex(-r,-i);}返回類型類名::operator

-(){

相關(guān)操作;}2、單目運(yùn)算重載為成員函數(shù)1)負(fù)號(hào)運(yùn)算符++分:先增和后增返回類型類名::operator

++(){

相關(guān)操作;}先增:后增:返回類型類名::operator

++(int){

相關(guān)操作;}int只是為了標(biāo)志前后的區(qū)別,沒有其他作用。2、單目運(yùn)算重載為成員函數(shù)2)自增++、自減--#include<iostream.h>classCPoint{public: CPoint(intxx=0,intyy=0){ x=xx; y=yy; } voiddisp(){ cout<<"("<<x<<','<<y<<")"<<endl; } CPointoperator+(CPointq){ returnCPoint(x+q.x,y+q.y); } CPointoperator-(CPointq){ returnCPoint(x-q.x,y-q.y); } CPointoperator++() //先增{ x++; y++; return*this; } CPointoperator++(int) //后增{ CPointt(x,y); x++; y++; returnt;} CPointoperator--(){ x--; y--; return*this; } CPointoperator--(int){ CPointt(*this); x--; y--; returnt;}private: intx,y;};voidmain(){CPointa(10,10),b;a.disp();b=a++; a.disp();b.disp();b=++a; a.disp();b.disp();b=a--; a.disp();b.disp();b=--a; a.disp();b.disp();}(10,10)(11,11)(10,10)(12,12)(12,12)(11,11)(12,12)(10,10)(10,10)this指針是一個(gè)無需定義的特殊指針,它隱含于每一個(gè)類的成員函數(shù)中,指向正在被某個(gè)成員函數(shù)操作的對(duì)象。如果某個(gè)對(duì)象調(diào)用了一個(gè)成員函數(shù),則系統(tǒng)首先將這個(gè)對(duì)象的地址賦給this指針,然后再調(diào)用成員函數(shù),因此也可以用*this來標(biāo)識(shí)調(diào)用該成員函數(shù)的對(duì)象。通常情況下,程序不顯式地使用this指針。2、單目運(yùn)算重載為成員函數(shù)3)下標(biāo)運(yùn)算符[]#include<iostream.h>classCArray{public:CArray(intsize); CArray(CArray&); ~CArray(); int&operator[](int);intgetAt(intnIndex);voidsetAt(intnIndex,intnewElement);private:int*data;//整型數(shù)組首地址intsize; //數(shù)組中的元素個(gè)數(shù)};CArray::CArray(ints){ size=s; data=newint[size];}CArray::CArray(CArray&a){size=a.size;data=newint[size];for(inti=0;i<size;i++) data[i]=a.data[i];}CArray::~CArray() { delete[]data; }int&CArray::operator[](intnIndex){ returndata[nIndex];}intCArray::getAt(intnIndex){ returndata[nIndex];}voidCArray::setAt(intnIndex,intnewElement){ data[nIndex]=newElement;}voidmain(){ CArraya(10); for(inti=0;i<10;i++) a[i]=i*2+1; for(i=0;i<10;i++) cout<<a[i]<<'\t'; cout<<endl;}classstring{public: string(constchar*); string(string&s); ~string(); voiddisp(); charoperator[](int);private: char*pstr; intlength;};charstring::operator[](inti){ returnpstr[i];}下標(biāo)運(yùn)算符[]voidmain(){ strings1("1234567890"); s1.disp(); cout<<s1[5]<<endl;}二、重載為友元函數(shù)在類中聲明為友元函數(shù):friend返回類型operator重載的運(yùn)算符(參數(shù)類型列表);程序中出現(xiàn)形式:(以雙目運(yùn)算符為例)C1運(yùn)算符C2operator運(yùn)算符(C1,C2)編譯程序解釋形式:其中,C1和C2是類的對(duì)象,operator運(yùn)算符則是運(yùn)算符重載函數(shù)名。定義形式:返回類型operator重載的運(yùn)算符(參數(shù)列表){

相關(guān)操作;}1、雙目運(yùn)算重載為友元函數(shù)輸入>>輸出<<必須重載為友元復(fù)數(shù)的雙目運(yùn)算符重載(友元函數(shù))2+3i4+5i6+8i-2-2i0+1iinclude<iostream.h>classComplex{public: Complex(doublea=0,doubleb=0){r=a,i=b; } voiddisp(){if(i>0)cout<<r<<"+"<<i<<"i\n"; elseif(i<0) cout<<r<<i<<"i\n"; else cout<<r<<endl; } friendComplexoperator+(Complex&,Complex&); friendComplexoperator-(Complex&,Complex&); friendComplexoperator+=(Complex&,Complex&);private: doubler,i;};Complexoperator+(Complex&a,Complex&b){ returnComplex(a.r+b.r,a.i+b.i); }Complexoperator-(Complex&a,Complex&b){ returnComplex(a.r-b.r,a.i-b.i); }Complexoperator+=(Complex&a,Complex&b){ a.r+=b.r; a.i+=b.i; returna; }voidmain(){Complexa(2,3),b(4,5); Complexc(a+b); a.disp(); b.disp(); c.disp(); c=a-b; c.disp(); a+=c; a.disp();}operator-(a,b)operator+=(a,c)operator+(a,b)2、復(fù)數(shù)的單目運(yùn)算符重載(友元函數(shù))include<iostream.h>classComplex{public: Complex(doublea=0,doubleb=0){r=a,i=b; } voiddisp(){ if(i>0)cout<<r<<"+"<<i<<"i\n"; elseif(i<0) cout<<r<<i<<"i\n"; else cout<<r<<endl; } friendComplexoperator++(Complex&a); friendComplexoperator++(Complex&a,int); friendComplexoperator--(Complex&a); friendComplexoperator--(Complex&a,int);private: doubler,i;};Complexoperator++(Complex&a){ a.r++; a.i++; returna; }Complexoperator++(Complex&a,int){ Complext(a.r++,a.i++); returnt; }Complexoperator--(Complex&a){ a.r--; a.i--; returna; }Complexoperator--(Complex&a,int){ Complext(a.r--,a.i--); returnt; }Complexa(10,10),b;a.disp();b=a++; a.disp();b.disp();b=++a; a.disp();b.disp();b=a--; a.disp();b.disp();b=--a; a.disp();b.disp();10+10i11+11i10+10i12+12i12+12i11+11i12+12i10+10i10+10i-22->>和<<運(yùn)算符C++預(yù)定義了cout和cin輸入輸出流對(duì)象。cout為內(nèi)置數(shù)據(jù)類型提供了重載的<<運(yùn)算符,支持對(duì)它們的輸出操作,cin重載了>>運(yùn)算符,支持對(duì)它們的輸入操作。如果希望自定義類支持cout和cin的<<和>>操作,需要重載這些運(yùn)算符。-23-classCounter{public:

friendstd::ostream&operator<< (std::ostream&out,constCounter&c);…….};重載輸出運(yùn)算符operator<<必須重載為友元函數(shù),參數(shù)為輸入流對(duì)象

和被輸出對(duì)象,返回輸出流對(duì)象,以支持連續(xù)輸出。std::ostream&operator<<(std::ostream&out, constCounter&c){ out<<c.getValue()<<std::endl; returnout;}operator<<運(yùn)算符函數(shù),將c的內(nèi)容輸出到傳入的輸出流

中,并返回out的引用。以支持形同cout<<c1<<c2的級(jí)聯(lián)式輸出。當(dāng)運(yùn)算符重載函數(shù)為:成員函數(shù)--:雙目運(yùn)算符的參數(shù)個(gè)數(shù)是1個(gè);單目運(yùn)算符的參數(shù)個(gè)數(shù)為0友元函數(shù)---單目運(yùn)算符的參數(shù)個(gè)數(shù)就是1個(gè),雙目運(yùn)算符的參數(shù)個(gè)數(shù)是2個(gè)這是因?yàn)橹剌d為成員函數(shù)時(shí),總是隱含了一個(gè)參數(shù),該參數(shù)是this指針,它是指向調(diào)用該成員函數(shù)對(duì)象的指針,而重載為友元函數(shù)時(shí)則沒有隱含的this指針。運(yùn)算符重載的原則運(yùn)算符重載不改變運(yùn)算符的優(yōu)先級(jí)和結(jié)合性,不改變其語法結(jié)構(gòu),也就是不能改變操作數(shù)的個(gè)數(shù)。即單目的只能重載為單目運(yùn)算符,雙目的只能重載為雙目運(yùn)算符。只能對(duì)已有運(yùn)算符重載,不能自定義運(yùn)算符??芍剌d的運(yùn)算符運(yùn)算符名稱運(yùn)算符名稱,逗號(hào)運(yùn)算符<小于!=不等<<左移%取模<<=左移/賦值%=取模/賦值<=小于等于&=賦值&&邏輯與==等于&=按位與/賦值>大于*乘>=大于等于*=乘/賦值>>右移+加>>=右移/賦值+=加/賦值^異或-減^=異或/賦值-=減/賦值|按位或->成員選取|=按位或/賦值/除||邏輯或/=除/賦值

按位與不可重載的運(yùn)算符5個(gè):

..*::?:sizeof作業(yè)1、定義復(fù)數(shù)類,實(shí)現(xiàn)復(fù)數(shù)的+、-、+=、++先、++后、--先、--后運(yùn)算符重載:成

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論