版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
算術運算符:加(+)、減strings1,s2;//s1,s2為字符串對象s1+s2//?Complexa,b;//復數(shù)類對象a+b//???a-b//???x+y//x,y為int,float,double,char….問題引出:運算符重載問題引出:自定義類型的運算#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ù)調用:c=a.operator+(b);c=a.operator-(b);定義了兩個重載運算符的成員函數(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;}; 定義了兩個重載運算符的成員函數(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();}對表達式a+b、a-b,編譯器將其解釋為函數(shù)調用:
a.operator+(b);a.operator–(b);運算符重載C++提供了運算符重載的機制,程序員可對自定義的數(shù)據(jù)類型使用C++本身提供的標準運算符進行運算,運算的實現(xiàn)由重載運算符的特殊函數(shù)來完成。這些函數(shù)有特殊的函數(shù)名(operator+),可使用運算符方式進行調用,也可以使用傳統(tǒng)的函數(shù)調用方式進行調用。運算符重載:賦予已有的運算符多重含義,如運算符“>>”既作為流的插入運算符,又作為移位運算符,根據(jù)其操作對象的不同,執(zhí)行其不同的功能。在c++中,允許對大多數(shù)的運算符進行重載,通過定義重載運算符的函數(shù)使它能夠用于特定類的對象。運算符重載的實現(xiàn)運算符重載實際上是將運算符重載為一個函數(shù),在重載某個運算符時,實際上就是定義一個重載運算符的函數(shù),函數(shù)名為operator運算符。在執(zhí)行被重載的運算符時,系統(tǒng)自動調用該函數(shù)以實現(xiàn)相應的運算對表達式a+b、a–b,編譯器將其解釋為函數(shù)調用:
a.operator+(b); a.operator–(b);運算符重載是通過定義函數(shù)實現(xiàn)的,運算符重載實質上是函數(shù)的重載(遵循函數(shù)重載的原則)。對于重載的運算符可以使用運算符方式調用,也可以使用函數(shù)調用方式調用。ComplexComplex::operator+(Complex&t){ returnComplex(r+t.r,i+t.i); }ComplexComplex::operator-(Complex&t){ returnComplex(r-t.r,i-t.i);}重載運算符的函數(shù)的定義形式[friend]返回類型[類名::]operator
重載的運算符(參數(shù)列表){
相關操作;}參數(shù)的個數(shù)由以下兩個因素決定:1操作符是單目還是雙目運算符2定義為友元函數(shù)還是成員函數(shù)友元函數(shù)成員函數(shù)單目運算符1個參數(shù)0個參數(shù)雙目運算符2個參數(shù)1個參數(shù)在C++中提供了兩種形式的運算符重載,即重載為:成員函數(shù)、友元函數(shù)如果是友元函數(shù),那么對于單目運算符,它的參數(shù)個數(shù)就是1個,雙目運算符的參數(shù)個數(shù)是2個;如果是成員函數(shù),那么對于單目運算符的參數(shù)個數(shù)為0,雙目運算符的參數(shù)個數(shù)是1個(這是由于該類本身也作為一個操作數(shù)參與計算)。一、重載為類的成員函數(shù)類中的函數(shù)原型聲明:返回類型operator
重載的運算符(參數(shù)類型列表);程序中出現(xiàn)(以雙目運算符為例)C1運算符C2C1.
operator運算符(C2)編譯程序解釋為函數(shù)調用:其中,C1和C2是類的對象,operator運算符則是運算符重載函數(shù)名。1、雙目運算重載為成員函數(shù)定義形式:返回類型[類名::]operator重載的運算符(參數(shù)列表){
相關操作;}對表達式a+b、a–c,編譯器將其解釋為函數(shù)調用:
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();}復數(shù)的運算符重載(成員函數(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;}字符串的運算符重載(成員函數(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)注意關于“=”賦值運算:C++允許同類對象間的賦值,將其對應的數(shù)據(jù)成員賦值;如果在構造函數(shù)中有資源申請,則不能使用系統(tǒng)的賦值方式,而必須重載賦值運算符,如string類;沒有資源分配,可不重載賦值運算符,如Complex類。不能自造運算符:如字符串的比較函數(shù),沒有相應的運算符,不能用戶自己定義。classComplex{public:Complex(doubler=0,doublei=0);voidShow();Complexoperator-();//對單目負號重載private:doubler,i;};ComplexComplex::operator-()//對單目負號重載//第一個Complex為函數(shù)返回值類型,第二個Complex為類名{returnComplex(-r,-i);}返回類型類名::operator
-(){
相關操作;}2、單目運算重載為成員函數(shù)1)負號運算符++分:先增和后增返回類型類名::operator
++(){
相關操作;}先增:后增:返回類型類名::operator
++(int){
相關操作;}int只是為了標志前后的區(qū)別,沒有其他作用。2、單目運算重載為成員函數(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指針是一個無需定義的特殊指針,它隱含于每一個類的成員函數(shù)中,指向正在被某個成員函數(shù)操作的對象。如果某個對象調用了一個成員函數(shù),則系統(tǒng)首先將這個對象的地址賦給this指針,然后再調用成員函數(shù),因此也可以用*this來標識調用該成員函數(shù)的對象。通常情況下,程序不顯式地使用this指針。2、單目運算重載為成員函數(shù)3)下標運算符[]#include<iostream.h>classCArray{public:CArray(intsize); CArray(CArray&); ~CArray(); int&operator[](int);intgetAt(intnIndex);voidsetAt(intnIndex,intnewElement);private:int*data;//整型數(shù)組首地址intsize; //數(shù)組中的元素個數(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];}下標運算符[]voidmain(){ strings1("1234567890"); s1.disp(); cout<<s1[5]<<endl;}二、重載為友元函數(shù)在類中聲明為友元函數(shù):friend返回類型operator重載的運算符(參數(shù)類型列表);程序中出現(xiàn)形式:(以雙目運算符為例)C1運算符C2operator運算符(C1,C2)編譯程序解釋形式:其中,C1和C2是類的對象,operator運算符則是運算符重載函數(shù)名。定義形式:返回類型operator重載的運算符(參數(shù)列表){
相關操作;}1、雙目運算重載為友元函數(shù)輸入>>輸出<<必須重載為友元復數(shù)的雙目運算符重載(友元函數(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、復數(shù)的單目運算符重載(友元函數(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->>和<<運算符C++預定義了cout和cin輸入輸出流對象。cout為內(nèi)置數(shù)據(jù)類型提供了重載的<<運算符,支持對它們的輸出操作,cin重載了>>運算符,支持對它們的輸入操作。如果希望自定義類支持cout和cin的<<和>>操作,需要重載這些運算符。-23-classCounter{public:
friendstd::ostream&operator<< (std::ostream&out,constCounter&c);…….};重載輸出運算符operator<<必須重載為友元函數(shù),參數(shù)為輸入流對象
和被輸出對象,返回輸出流對象,以支持連續(xù)輸出。std::ostream&operator<<(std::ostream&out, constCounter&c){ out<<c.getValue()<<std::endl; returnout;}operator<<運算符函數(shù),將c的內(nèi)容輸出到傳入的輸出流
中,并返回out的引用。以支持形同cout<<c1<<c2的級聯(lián)式輸出。當運算符重載函數(shù)為:成員函數(shù)--:雙目運算符的參數(shù)個數(shù)是1個;單目運算符的參數(shù)個數(shù)為0友元函數(shù)---單目運算符的參數(shù)個數(shù)就是1個,雙目運算符的參數(shù)個數(shù)是2個這是因為重載為成員函數(shù)時,總是隱含了一個參數(shù),該參數(shù)是this指針,它是指向調用該成員函數(shù)對象的指針,而重載為友元函數(shù)時則沒有隱含的this指針。運算符重載的原則運算符重載不改變運算符的優(yōu)先級和結合性,不改變其語法結構,也就是不能改變操作數(shù)的個數(shù)。即單目的只能重載為單目運算符,雙目的只能重載為雙目運算符。只能對已有運算符重載,不能自定義運算符??芍剌d的運算符運算符名稱運算符名稱,逗號運算符<小于!=不等<<左移%取模<<=左移/賦值%=取模/賦值<=小于等于&=賦值&&邏輯與==等于&=按位與/賦值>大于*乘>=大于等于*=乘/賦值>>右移+加>>=右移/賦值+=加/賦值^異或-減^=異或/賦值-=減/賦值|按位或->成員選取|=按位或/賦值/除||邏輯或/=除/賦值
按位與不可重載的運算符5個:
..*::?:sizeof作業(yè)1、定義復數(shù)類,實現(xiàn)復數(shù)的+、-、+=、++先、++后、--先、--后運算符重載:成
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年福建省漳州市公開招聘警務輔助人員輔警筆試自考題2卷含答案
- 平安家庭事跡材料
- 西藏日喀則地區(qū)(2024年-2025年小學六年級語文)統(tǒng)編版專題練習(上學期)試卷及答案
- 2024年多士爐項目資金需求報告代可行性研究報告
- 風力發(fā)電科技合同管理辦法
- 證券交易會計崗位聘用協(xié)議
- 實習期間權益保障合同
- 生態(tài)保護區(qū)檢查井施工協(xié)議
- 2024年新型分子篩系列產(chǎn)品項目資金申請報告代可行性研究報告
- 合同風險控制培訓
- 中學歷史教育中的德育狀況調查問卷
- 教科版四年級科學上冊全冊復習教學設計及知識點整理
- 重慶萬科渠道制度管理辦法2022
- 上海黃金交易所貴金屬交易員題庫
- 蒸汽管道設計表(1)
- 提撈采油安全操作規(guī)程
- 建筑工程質量管理體系文件
- in、ing對比辨音練習.doc
- 光刻工藝光刻對準
- 世界各國標準鋼號對照表
- 文化部鼓勵參加的國際藝術比賽
評論
0/150
提交評論