版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度國際貨物銷售與品牌推廣合同模板
- 2025年度教育科技股份購買合同范本(含知識(shí)產(chǎn)權(quán)保護(hù))
- 2025年度跨境海運(yùn)貨物保險(xiǎn)合同編號(hào)
- 二零二五年度工業(yè)廠房自動(dòng)門采購合同示范文本4篇
- 2025年度廣告投放效果分析與反饋合同
- 2025年度沿海漁貨運(yùn)輸海運(yùn)承運(yùn)合同
- 2025年度智能物流系統(tǒng)設(shè)備采購與維護(hù)服務(wù)合同
- 2025年度國有公園租賃合同范本(游園項(xiàng)目)
- 二零二四年度企業(yè)勞動(dòng)合同員工績(jī)效考核與獎(jiǎng)懲規(guī)定3篇
- 2025年度廣告燈箱廣告品牌合作推廣合同
- 成品移動(dòng)公廁施工方案
- 2025年度部隊(duì)食堂食材采購與質(zhì)量追溯服務(wù)合同3篇
- 新人教版一年級(jí)下冊(cè)數(shù)學(xué)教案集體備課
- 繪本 課件教學(xué)課件
- 大型央國企信創(chuàng)化與數(shù)字化轉(zhuǎn)型規(guī)劃實(shí)施方案
- pcn培訓(xùn)培訓(xùn)課件
- 過錯(cuò)方財(cái)產(chǎn)自愿轉(zhuǎn)讓協(xié)議書(2篇)
- 牧場(chǎng)物語-礦石鎮(zhèn)的伙伴們-完全攻略
- ISO 22003-1:2022《食品安全-第 1 部分:食品安全管理體系 審核與認(rèn)證機(jī)構(gòu)要求》中文版(機(jī)翻)
- 農(nóng)業(yè)生產(chǎn)質(zhì)量安全風(fēng)險(xiǎn)評(píng)估與監(jiān)控方案
- 人教版六年級(jí)上冊(cè)解方程練習(xí)300道及答案
評(píng)論
0/150
提交評(píng)論