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

下載本文檔

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

文檔簡(jiǎn)介

1、運(yùn)算符重載運(yùn)算符重載10. 運(yùn)算符重載一般概念21. 運(yùn)算符重載規(guī)則21.1. 允許重載的運(yùn)算符21.2. 不允許重載的運(yùn)算符21.3. 其他規(guī)則32. 運(yùn)算符重載普通函數(shù)、友員函數(shù)和類(lèi)成員函數(shù)33. 單目預(yù)算符、雙目運(yùn)算符重載54. 轉(zhuǎn)換構(gòu)造函數(shù)和類(lèi)型轉(zhuǎn)換運(yùn)算符55. 賦值運(yùn)算符的重載76. 下標(biāo)運(yùn)算符重載87. new和delete重載88. 指針運(yùn)算符-的重載90. 運(yùn)算符重載一般概念c+內(nèi)部定義的數(shù)據(jù)類(lèi)型(int , float, )的數(shù)據(jù)操作可以用運(yùn)算符號(hào)來(lái)表示,其使用形式是表達(dá)式,用戶(hù)自定義的類(lèi)型的數(shù)據(jù)的操作則用函數(shù)表示,其使用形式是函數(shù)調(diào)用。為了是對(duì)用戶(hù)自定義數(shù)據(jù)類(lèi)型的數(shù)據(jù)的操作

2、與內(nèi)定義的數(shù)據(jù)類(lèi)型的數(shù)據(jù)的操作形式一致,c+提供了運(yùn)算符的重載,通過(guò)把c+中預(yù)定義大的運(yùn)算符重載為類(lèi)的成員函數(shù)或者友員函數(shù),使得對(duì)用戶(hù)的自定義數(shù)據(jù)類(lèi)型的數(shù)據(jù)對(duì)象的操作形式與c+內(nèi)部定義的類(lèi)型的數(shù)據(jù)一致。重載即賦予新的含義。運(yùn)算符重載指對(duì)已知的運(yùn)算符,在新的場(chǎng)合,通過(guò)程序?qū)崿F(xiàn)新的行為。1. 運(yùn)算符重載規(guī)則1.1. 允許重載的運(yùn)算符表 1.1 允許重載的運(yùn)算符雙目運(yùn)算符+ - * / %關(guān)系運(yùn)算符= != =邏輯運(yùn)算符| & +單目運(yùn)算符+ - * &自增自減運(yùn)算符+ -位運(yùn)算符| & 賦值運(yùn)算符= += -= *= /= %= &= |= = =空間申請(qǐng)和釋放new delete new del

3、ete其他運(yùn)算符() - -* , 1.2. 不允許重載的運(yùn)算符不允許重載的運(yùn)算符只有5個(gè):.(成員訪問(wèn)符).*(成員指針訪問(wèn)運(yùn)算符):(域運(yùn)算符)sizeof(長(zhǎng)度運(yùn)算符)?:(條件運(yùn)算符號(hào))1.3. 其他規(guī)則 不允許自己定義新的運(yùn)算符,只能對(duì)已有的運(yùn)算符號(hào)進(jìn)行重載; 重載不能改變運(yùn)算符運(yùn)算對(duì)象的個(gè)數(shù),如和m_freal+cpx2.m_freal;cpxret.m_fimag=this-m_fimag+cpx2.m_fimag;return cpxret;3. 轉(zhuǎn)換構(gòu)造函數(shù)和類(lèi)型轉(zhuǎn)換運(yùn)算符 類(lèi)的轉(zhuǎn)換構(gòu)造函數(shù)只帶一個(gè)參數(shù),它把參數(shù)類(lèi)型的的數(shù)據(jù)轉(zhuǎn)換成相應(yīng)類(lèi)型的類(lèi)的對(duì)象。這與拷貝構(gòu)造函數(shù)不同,拷貝

4、構(gòu)造函數(shù)的參數(shù)是同類(lèi)型對(duì)象的引用。例如class ccomplexpublic:double m_freal;double m_fimag;ccomplex();ccomplex(double freal, double fimag=0)m_freal=freal;m_fimag=fimag;int main()ccomplex cpx;cpx=9;return 0;“px=9”一句將數(shù)值9轉(zhuǎn)換成一個(gè)臨時(shí)的ccomplex對(duì)象,并拷貝給cpx。與之相對(duì)應(yīng),可以通過(guò)轉(zhuǎn)換運(yùn)算符,將一個(gè)類(lèi)的對(duì)象轉(zhuǎn)換成其他類(lèi)型的數(shù)據(jù)。對(duì)于類(lèi)x,轉(zhuǎn)換后的類(lèi)型為t,則類(lèi)型轉(zhuǎn)換運(yùn)算符的形式為:x:operator t()/

5、如class ccomplexpublic:double m_freal;double m_fimag;ccomplex();ccomplex(double freal, double fimag=0)m_freal=freal;m_fimag=fimag;operator double()return m_freal;int main()ccomplex cpx(2,3);double f=double(cpx);4. 流運(yùn)行符的重載class complex;ostream operator(istream& is, complex& c);complex operator+(comple

6、x &first, complex &second );class complex public: complex()real=0;imag=0; complex(double r,double i)real=r;imag=i; /convert struct complex(double c)real = c; imag = 0; /convert operator operator double() return real; operator char*() char* s = (char*)malloc(100); /strcpy(s,value:(%d,%d); sprintf(s,v

7、alue:(%.2f,%.2f), real,imag); /string s = value:; /s = s+tt;/(;/+real+,+imag+); return s; friend complex operator+(complex &first, complex &second ); friend ostream operator(istream& is, complex& c); void display() cout(real,imagi)(istream& is, complex& c)coutinput a complex :nc.realc.imag ;return i

8、s;ostream operator(ostream& os, complex& c)oscomplex value is:(c.real,c.imag)endl;return os;int main() /+complex c1(3,5),c2(13,15),c3(23,25);complex c = c1+c2;c1 = c+2.5;c1 = 2.5+c;/complex cc,ccc;cinccccc;coutcccccendl; return 0;5. 前加+/-和后加+/-的重載前加+complex complex :operator+()return complex(+real,+

9、imag);后加+complex complex :operator+(int) /after +complex temp(*this);temp.real+;temp.imag+;return temp;6. 賦值運(yùn)算符的重載缺省的賦值運(yùn)算符是實(shí)行對(duì)象間的按位拷貝,如果類(lèi)成員中含有指針類(lèi)型的數(shù)據(jù)成員,一般應(yīng)該將該類(lèi)的賦值運(yùn)算符重載,如:class cmystringprivate:char *m_pszdata;public:cmystring(char *pszdata);/構(gòu)造函數(shù)cmystring(cmystring &objstr);/拷貝構(gòu)造函數(shù)cmystring &operato

10、r=(cmystring &objstr);/重載=操作符cmystring &operator=(char *pszdata);/重載=操作符cmystring()delete m_pszdata;cmystring:cmystring(char *pszdata)m_pszdata=new charstrlen(pszdata)+1;strcpy(m_pszdata,pszdata);待添加的隱藏文字內(nèi)容3cmystring:cmystring(cmystring &objstr)m_pszdata=new charstrlen(objstr.m_pszdata)+1;strcpy(m_p

11、szdata,objstr.m_pszdata);cmystring &cmystring:operator=(cmystring &objstr)if(this=&objstr)return *this;delete m_pszdata;m_pszdata=new charstrlen(objstr.m_pszdata)+1;strcpy(m_pszdata,objstr.m_pszdata);return *this;cmystring &cmystring:operator=(char *pszdata)delete m_pszdata;m_pszdata=new charstrlen(

12、pszdata)+1;strcpy(m_pszdata,pszdata);return *this;int main()cmystring s1=abc;cmystring s2=xyz;s1=123;s1=s2;return 0;7. 下標(biāo)運(yùn)算符重載標(biāo)準(zhǔn)情況下,運(yùn)算符用于訪問(wèn)數(shù)組的元素。我們可以通過(guò)重載下標(biāo)運(yùn)算符為類(lèi)運(yùn)算符。使得可以象訪問(wèn)數(shù)組元素一樣的訪問(wèn)對(duì)象中的數(shù)據(jù)成員。c+只允許把下標(biāo)運(yùn)算符重載為非靜態(tài)的成員函數(shù)。下標(biāo)運(yùn)算符的定義形式為:t1 t:operator (t2);其中t1為希望返回的數(shù)據(jù)類(lèi)型,t為類(lèi)名,t2為下標(biāo),它可以是任意類(lèi)型。如需訪問(wèn)第5節(jié)中的cmystring的某個(gè)字

13、符的話(huà),在類(lèi)中可聲明重載運(yùn)算符:char operator(int iindex);在外部定義該運(yùn)算符重載函數(shù)char cmystring:operator(int iindex)if(iindexstrlen(m_pszdata)return m_pszdataiindex;return 0;8. new和delete重載通過(guò)重載new和delete,我們可以自己實(shí)現(xiàn)內(nèi)存的管理策略。new和delete只能重載為類(lèi)的靜態(tài)運(yùn)算符。而且重載時(shí),無(wú)論是否顯示指定static關(guān)鍵字,編譯器都認(rèn)為是靜態(tài)的運(yùn)算符重載函數(shù)。 重載new時(shí),必須返回一個(gè)void *類(lèi)型的指針,它可以帶多個(gè)參數(shù),但第一個(gè)參數(shù)

14、必須是size_t類(lèi)型,該參數(shù)的值由系統(tǒng)確定。class ctest/.void *operator new(size_t nsize)cout”new called,size=”nsizevoid *pret=:new charnsize;return pret; 重載delete時(shí)必須返回void類(lèi)型,它可以帶有多個(gè)參數(shù),但第一個(gè)參數(shù)必須是要釋放的內(nèi)存的地址,其類(lèi)型為void *,如果重載delete時(shí)指定了第二個(gè)參數(shù),第二個(gè)參數(shù)必須為size_t類(lèi)型。接上:class ctest/.void *operator new(size_t nsize)cout”new called,size=”nsizevoid *pret=:new charnsize;return pret;void operator delete(void *pvoid)cout”delete called”的重載class cdatasetpublic:int getfield(int &ifieldvalue, const char *pszfieldname)/.return 0;class

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論