C++運(yùn)算符重載知識(shí)點(diǎn)總結(jié)_第1頁
C++運(yùn)算符重載知識(shí)點(diǎn)總結(jié)_第2頁
C++運(yùn)算符重載知識(shí)點(diǎn)總結(jié)_第3頁
C++運(yùn)算符重載知識(shí)點(diǎn)總結(jié)_第4頁
C++運(yùn)算符重載知識(shí)點(diǎn)總結(jié)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

精選優(yōu)質(zhì)文檔-----傾情為你奉上精選優(yōu)質(zhì)文檔-----傾情為你奉上專心---專注---專業(yè)專心---專注---專業(yè)精選優(yōu)質(zhì)文檔-----傾情為你奉上專心---專注---專業(yè)C++運(yùn)算符重載知識(shí)總結(jié)5.1編譯時(shí)的多態(tài)性與運(yùn)行時(shí)的多態(tài)性

在C++中,多態(tài)性的實(shí)現(xiàn)和聯(lián)編(也叫綁定)這一概念有關(guān)。源程序—>編譯、連接—>可執(zhí)行文件這一過程時(shí)把可執(zhí)行代碼聯(lián)編在一起的過程。其中在運(yùn)行之前就完成的聯(lián)編叫做靜態(tài)聯(lián)編,又叫前期聯(lián)編;而在程序運(yùn)行時(shí)才完成的聯(lián)編叫動(dòng)態(tài)聯(lián)編,也叫后期聯(lián)編。靜態(tài)聯(lián)編(前期聯(lián)編):指系統(tǒng)在編譯時(shí)就決定如何實(shí)現(xiàn)某一動(dòng)作。要求在編譯時(shí)就知道調(diào)用函數(shù)的全部信息。靜態(tài)聯(lián)編支持的多態(tài)性成為編譯時(shí)多態(tài)性(靜態(tài)多態(tài)性),通過函數(shù)重載(包括運(yùn)算符重載)和模板實(shí)現(xiàn)。優(yōu)點(diǎn):函數(shù)調(diào)用速度很快,效率高。動(dòng)態(tài)聯(lián)編(后期聯(lián)編):指系統(tǒng)在運(yùn)行時(shí)動(dòng)態(tài)實(shí)現(xiàn)某一動(dòng)作。采用這種聯(lián)編方式,一直要到程序運(yùn)行時(shí)才能確定調(diào)用哪個(gè)函數(shù)。動(dòng)態(tài)聯(lián)編支持的多態(tài)性成為運(yùn)行時(shí)多態(tài)性(動(dòng)態(tài)多態(tài)性),通過虛函數(shù)實(shí)現(xiàn)。優(yōu)點(diǎn):提供了更好的靈活性、問題抽象性和程序易維護(hù)性。5.2運(yùn)算符重載5.2.1在類外定義的運(yùn)算符重載函數(shù)

為了表達(dá)上的方便,人們希望預(yù)定義的運(yùn)算符(如+、-、*、/等)在特定的對(duì)象上以新的含義進(jìn)行解釋,如希望能夠?qū)崿F(xiàn)兩個(gè)復(fù)數(shù)類的加減,這就需要通過運(yùn)算符重載來解決。

C++中進(jìn)行運(yùn)算符重載時(shí),必須定義一個(gè)運(yùn)算符重載函數(shù),其名字為operator,后隨一個(gè)要重載的運(yùn)算符。函數(shù)功能operator+加法operator-減法operator*乘法operator<小于………...例如,使兩個(gè)Complex類對(duì)象相加的例子#include<iostream>usingnamespacestd;classComplex{public:

doublereal;

doubleimag;

Complex(doubler=0,doublei=0)

{

real=r;imag=i;

}};Complexoperator+(Complexco1,Complexco2)//類外定義運(yùn)算符+的重載函數(shù){

Complextemp;

temp.real=co1.real+co2.real;

temp.imag=co1.imag+co2.imag;

returntemp;}intmain(){

Complexcom1(1.1,2.2),com2(3.3,4.4),total1,total2;

total1=operator+(com1,com2);//運(yùn)算符重載函數(shù)第一種調(diào)用方式,顯式調(diào)用

cout<<"real1="<<total1.real<<",imag1="<<total1.imag<<endl;

total2=com1+com2;//運(yùn)算符重載函數(shù)第二種調(diào)用方式,隱式調(diào)用

cout<<"real2="<<total2.real<<",imag2="<<total2.imag<<endl;

return0;}C++語言對(duì)運(yùn)算符重載制定了以下一些規(guī)則:1.絕大部分運(yùn)算符可以重載,不能重載的只有以下幾個(gè):.成員訪問運(yùn)算符.*成員指針訪問運(yùn)算符::作用域運(yùn)算符sizeof長(zhǎng)度運(yùn)算符?:條件運(yùn)算符2.只能對(duì)已有運(yùn)算符進(jìn)行重載,不允許用戶自己定義新的運(yùn)算符。3.運(yùn)算符重載是針對(duì)新類型數(shù)據(jù)的實(shí)際需要,不建議改變?cè)\(yùn)算符的含義。(例如將+運(yùn)算符重載為進(jìn)行減法運(yùn)算)4.運(yùn)算符重載不能改變運(yùn)算符的操作對(duì)象(即操作數(shù))的個(gè)數(shù)。5.運(yùn)算符重載不能改變運(yùn)算符原有的優(yōu)先級(jí)。6.運(yùn)算符重載不能改變運(yùn)算符原有的結(jié)合性。7.運(yùn)算符重載函數(shù)的參數(shù)至少有一個(gè)是類對(duì)象(或其引用)。目的是防止用戶修改用于標(biāo)準(zhǔn)類型數(shù)據(jù)的運(yùn)算符性質(zhì)。8.運(yùn)算符重載函數(shù)可以是普通函數(shù)、類成員函數(shù)、類的友元函數(shù)。9.賦值運(yùn)算符“="可以不必用戶進(jìn)行重載。5.2.2友元運(yùn)算符重載函數(shù)1.定義友元運(yùn)算符重載的語法形式1)在類的內(nèi)部,形式為:

friend函數(shù)類型operator運(yùn)算符(形參表)

{

函數(shù)體

}2)類內(nèi)聲明,類外定義,形式為:

class

X{

friend函數(shù)類型operator運(yùn)算符(形參表);

};

函數(shù)類型operator運(yùn)算符(形參表)

{

函數(shù)體

}2.重載為友元函數(shù)時(shí),沒有隱含的參數(shù)this指針,這樣對(duì)于雙目運(yùn)算符,友元函數(shù)有兩個(gè)參數(shù),對(duì)于單目運(yùn)算符,友元函數(shù)有一個(gè)參數(shù)。

3.以下運(yùn)算符不能定義為友元運(yùn)算符重載函數(shù):賦值運(yùn)算符“=”、下標(biāo)運(yùn)算符“[]”、函數(shù)調(diào)用運(yùn)算符“()”、“->”

。5.2.3成員運(yùn)算符重載函數(shù)1.定義成員運(yùn)算符重載的語法形式1)在類的內(nèi)部,形式為:

函數(shù)類型operator運(yùn)算符(形參表)

{

函數(shù)體

}2)類內(nèi)聲明,類外定義,形式為:

class

X{

函數(shù)類型operator運(yùn)算符(形參表);

};

函數(shù)類型X::operator運(yùn)算符(形參表)

{

函數(shù)體

}2.對(duì)雙目運(yùn)算符而言,成員運(yùn)算符重載函數(shù)的形參表中僅有一個(gè)參數(shù),它作為運(yùn)算符的右操作數(shù),另一個(gè)操作數(shù)(左操作數(shù))是隱含的,是該類的當(dāng)前對(duì)象,它是通過this指針隱含地傳遞給函數(shù)的。3.對(duì)于單目運(yùn)算符而言,成員運(yùn)算符重載函數(shù)的參數(shù)表中沒有參數(shù),此時(shí)當(dāng)前對(duì)象作為運(yùn)算符的一個(gè)操作數(shù)。5.2.4成員運(yùn)算符重載函數(shù)與友元運(yùn)算符重載函數(shù)的比較(1)對(duì)雙目運(yùn)算符而言,成員運(yùn)算符重載函數(shù)參數(shù)表中含有一個(gè)參數(shù),而友元運(yùn)算符重載函數(shù)參數(shù)表中含有兩個(gè)參數(shù);(2)對(duì)于單目運(yùn)算符而言,成員運(yùn)算符重載函數(shù)的參數(shù)表中沒有參數(shù),而友元運(yùn)算符重載函數(shù)參數(shù)表中含有一個(gè)參數(shù)。(3)雙目運(yùn)算符一般可以被重載為友元運(yùn)算符函數(shù)或成員運(yùn)算符函數(shù),但以下情況必須使用友元函數(shù):將一個(gè)復(fù)數(shù)和一個(gè)整數(shù)相加Complexoperator+(inta){

return(real+a,imag);}若com和com1是類Complex的對(duì)象,則以下語句是對(duì)的:com1=com+100;//正確,+左側(cè)是類對(duì)象這條語句被解釋為:com1=com.operator+(100);然而以下語句就不起作用了:com1=100+com;//錯(cuò)誤,+左側(cè)是整數(shù)這條語句被解釋為:com1=100.operator+(com);若用友元函數(shù)則不會(huì)出現(xiàn)這種情況。c+100成員函數(shù):c.operator+(100)友元函數(shù):operator(c,100)100+c成員函數(shù):100.operator+(c)友元函數(shù):operator+(100,c)(4)友元運(yùn)算符函數(shù)和成員運(yùn)算符函數(shù)的調(diào)用形式:表達(dá)式友元函數(shù)調(diào)用成員函數(shù)調(diào)用a+boperator+(a,b)a.operator+(b)++aoperator++(a)a.operator++()-aoperator-(a)a.operator-()(5)一般來說,單目運(yùn)算符最好被重載為成員函數(shù),雙目運(yùn)算符被重載為友元函數(shù)。運(yùn)算符“=、()、[]、->”只能作為成員函數(shù);運(yùn)算符“+=、-=、/=、*=、&=、!=、%=”建議重載為成員函數(shù)。

5.2.5“++”和“--”重載

增1減1運(yùn)算符是單目運(yùn)算符,它們又有前綴運(yùn)算符和后綴運(yùn)算符兩種。為了區(qū)分這兩種運(yùn)算,將后綴運(yùn)算視為雙目運(yùn)算符,在參數(shù)表中插入int。運(yùn)算符名成員函數(shù)形式調(diào)用形式等價(jià)調(diào)用前綴++Xoperator++()++aa.Operator++()后綴++Xoperator++(int)a++a.Operator++(0)前綴--Xoperator--()--aa.Operator--()后綴--Xoperator--(int)a--a.Operator--(0)例題:使用成員函數(shù)重載運(yùn)算符“——”#include<iostream>usingnamespacestd;classThree{public:

Three(intI1=0,intI2=0,intI3=0);

voidprint();

Threeoperator--();//前綴方式

Threeoperator--(int);//后綴方式private:

inti1,i2,i3;};Three::Three(intI1,intI2,intI3){

i1=I1;i2=I2;i3=I3;}voidThree::print(){

cout<<"i1="<<i1<<",i2="<<i2<<",i3="<<i3<<endl;}ThreeThree::operator--(){

--i1;--i2;--i3;

return*this;//返回自減后的當(dāng)前對(duì)象}ThreeThree::operator--(int){

Threetemp(*this);

i1--;i2--;i3--;

returntemp;//返回自減前的當(dāng)前對(duì)象}intmain(){

Threeobj1(4,5,6),obj2,obj3(11,12,13),obj4;

//隱式調(diào)用

obj1.print();

--obj1;

obj1.print();

obj2=obj1--;

obj2.print();

obj1.print();

cout<<endl;

//顯式調(diào)用

obj3.print();

obj3.operator--();

obj3.print();

obj4=obj3.operator--(0);

obj4.print();

obj3.print();

return0;}例題:使用友員函數(shù)重載運(yùn)算符“十十”#include<iostream>usingnamespacestd;classThree{public:

Three(intI1=0,intI2=0,intI3=0);

voidprint();

friendThreeoperator++(Three&);

friendThreeoperator++(Three&,int);private:

inti1,i2,i3;};Three::Three(intI1,intI2,intI3){

i1=I1;i2=I2;i3=I3;}voidThree::print(){

cout<<"i1="<<i1<<",i2="<<i2<<",i3="<<i3<<endl;}Threeoperator++(Three&op){

++op.i3;++op.i2;++op.i1;

returnop;//}Threeoperator++(Three&op,int){

op.i3++;op.i2++;op.i1++;

returnop;//返回自減前的當(dāng)前對(duì)象}intmain(){

Threeobj1(4,5,6),obj2(14,15,16);

//隱式調(diào)用

obj1.print();//顯示原值

++obj1;

obj1.print();

obj1++;

obj1.print();

//顯式調(diào)用

cout<<endl;

obj2.print();//顯示原值

operator++(obj2);

obj2.print();

operator++(obj2,0);//后綴方式

obj2.print();

return0;}5.2.6賦值運(yùn)算符“=”重載對(duì)于任意一個(gè)類,如果用戶沒有定義賦值運(yùn)算符函數(shù),那么系統(tǒng)將自動(dòng)地為其生成一個(gè)默認(rèn)的賦值運(yùn)算符函數(shù),例如:X&X::operator=(constX&source){

//成員間賦值

}采用默認(rèn)的賦值運(yùn)算符函數(shù)實(shí)現(xiàn)的數(shù)據(jù)成員逐一賦值的方法是一種淺層復(fù)制方法,通常,默認(rèn)的賦值運(yùn)算符函數(shù)是能夠勝任工作的,但有些特殊情況下,如類中有指針類型時(shí),使用缺省的賦值運(yùn)算符函數(shù)會(huì)產(chǎn)生錯(cuò)誤。1.指針懸掛問題#include<iostream>usingnamespacestd;classString{public:

String(char*s)

{

cout<<"Constructorcalled"<<endl;

ptr=newchar[strlen(s)+1];

strcpy(ptr,s);

}

~String()

{

cout<<"Destructorcalled.---"<<ptr<<endl;

deleteptr;

}private:

char*ptr;};intmain(){

Stringp1("book");

Stringp2("jeep");

p2=p1;

return0;}運(yùn)行結(jié)果如下:ConstructorcalledConstructorcalledDestructorcalled.---bookDestructorcalled.—葺葺葺葺這是由于默認(rèn)的賦值運(yùn)算函數(shù)是淺層復(fù)制,只是改變指針指向,并沒有另開辟一塊新的內(nèi)存空間,使得第二次執(zhí)行析構(gòu)函數(shù)時(shí)企圖釋放同一空間,導(dǎo)致對(duì)同一個(gè)內(nèi)存空間進(jìn)行兩次釋放出錯(cuò)。于是出現(xiàn)的所謂的“指針懸掛”現(xiàn)象.2.用深層復(fù)制解決指針懸掛問題#include<iostream>usingnamespacestd;classString{public:

String(char*s)

{

cout<<"Constructorcalled"<<endl;

ptr=newchar[strlen(s)+1];

strcpy(ptr,s);

}

~String()

{

cout<<"Destructorcalled.---"<<ptr<<endl;

deleteptr;

}

String&operator=(constString&s);private:

char*ptr;};String&String::operator=(constString&s)//定義賦值運(yùn)算重載函數(shù){

if(this==&s)return*this;//防止s=s的賦值;

deleteptr;//釋放掉原區(qū)域

ptr=newchar[strlen(s.ptr)+1];//分配新區(qū)域

strcpy(ptr,s.ptr

溫馨提示

  • 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)論