




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
精選優(yōu)質(zhì)文檔-----傾情為你奉上精選優(yōu)質(zhì)文檔-----傾情為你奉上專心---專注---專業(yè)專心---專注---專業(yè)精選優(yōu)質(zhì)文檔-----傾情為你奉上專心---專注---專業(yè)C++運算符重載知識總結(jié)5.1編譯時的多態(tài)性與運行時的多態(tài)性
在C++中,多態(tài)性的實現(xiàn)和聯(lián)編(也叫綁定)這一概念有關。源程序—>編譯、連接—>可執(zhí)行文件這一過程時把可執(zhí)行代碼聯(lián)編在一起的過程。其中在運行之前就完成的聯(lián)編叫做靜態(tài)聯(lián)編,又叫前期聯(lián)編;而在程序運行時才完成的聯(lián)編叫動態(tài)聯(lián)編,也叫后期聯(lián)編。靜態(tài)聯(lián)編(前期聯(lián)編):指系統(tǒng)在編譯時就決定如何實現(xiàn)某一動作。要求在編譯時就知道調(diào)用函數(shù)的全部信息。靜態(tài)聯(lián)編支持的多態(tài)性成為編譯時多態(tài)性(靜態(tài)多態(tài)性),通過函數(shù)重載(包括運算符重載)和模板實現(xiàn)。優(yōu)點:函數(shù)調(diào)用速度很快,效率高。動態(tài)聯(lián)編(后期聯(lián)編):指系統(tǒng)在運行時動態(tài)實現(xiàn)某一動作。采用這種聯(lián)編方式,一直要到程序運行時才能確定調(diào)用哪個函數(shù)。動態(tài)聯(lián)編支持的多態(tài)性成為運行時多態(tài)性(動態(tài)多態(tài)性),通過虛函數(shù)實現(xiàn)。優(yōu)點:提供了更好的靈活性、問題抽象性和程序易維護性。5.2運算符重載5.2.1在類外定義的運算符重載函數(shù)
為了表達上的方便,人們希望預定義的運算符(如+、-、*、/等)在特定的對象上以新的含義進行解釋,如希望能夠?qū)崿F(xiàn)兩個復數(shù)類的加減,這就需要通過運算符重載來解決。
C++中進行運算符重載時,必須定義一個運算符重載函數(shù),其名字為operator,后隨一個要重載的運算符。函數(shù)功能operator+加法operator-減法operator*乘法operator<小于………...例如,使兩個Complex類對象相加的例子#include<iostream>usingnamespacestd;classComplex{public:
doublereal;
doubleimag;
Complex(doubler=0,doublei=0)
{
real=r;imag=i;
}};Complexoperator+(Complexco1,Complexco2)//類外定義運算符+的重載函數(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);//運算符重載函數(shù)第一種調(diào)用方式,顯式調(diào)用
cout<<"real1="<<total1.real<<",imag1="<<total1.imag<<endl;
total2=com1+com2;//運算符重載函數(shù)第二種調(diào)用方式,隱式調(diào)用
cout<<"real2="<<total2.real<<",imag2="<<total2.imag<<endl;
return0;}C++語言對運算符重載制定了以下一些規(guī)則:1.絕大部分運算符可以重載,不能重載的只有以下幾個:.成員訪問運算符.*成員指針訪問運算符::作用域運算符sizeof長度運算符?:條件運算符2.只能對已有運算符進行重載,不允許用戶自己定義新的運算符。3.運算符重載是針對新類型數(shù)據(jù)的實際需要,不建議改變原運算符的含義。(例如將+運算符重載為進行減法運算)4.運算符重載不能改變運算符的操作對象(即操作數(shù))的個數(shù)。5.運算符重載不能改變運算符原有的優(yōu)先級。6.運算符重載不能改變運算符原有的結(jié)合性。7.運算符重載函數(shù)的參數(shù)至少有一個是類對象(或其引用)。目的是防止用戶修改用于標準類型數(shù)據(jù)的運算符性質(zhì)。8.運算符重載函數(shù)可以是普通函數(shù)、類成員函數(shù)、類的友元函數(shù)。9.賦值運算符“="可以不必用戶進行重載。5.2.2友元運算符重載函數(shù)1.定義友元運算符重載的語法形式1)在類的內(nèi)部,形式為:
friend函數(shù)類型operator運算符(形參表)
{
函數(shù)體
}2)類內(nèi)聲明,類外定義,形式為:
class
X{
friend函數(shù)類型operator運算符(形參表);
};
函數(shù)類型operator運算符(形參表)
{
函數(shù)體
}2.重載為友元函數(shù)時,沒有隱含的參數(shù)this指針,這樣對于雙目運算符,友元函數(shù)有兩個參數(shù),對于單目運算符,友元函數(shù)有一個參數(shù)。
3.以下運算符不能定義為友元運算符重載函數(shù):賦值運算符“=”、下標運算符“[]”、函數(shù)調(diào)用運算符“()”、“->”
。5.2.3成員運算符重載函數(shù)1.定義成員運算符重載的語法形式1)在類的內(nèi)部,形式為:
函數(shù)類型operator運算符(形參表)
{
函數(shù)體
}2)類內(nèi)聲明,類外定義,形式為:
class
X{
函數(shù)類型operator運算符(形參表);
};
函數(shù)類型X::operator運算符(形參表)
{
函數(shù)體
}2.對雙目運算符而言,成員運算符重載函數(shù)的形參表中僅有一個參數(shù),它作為運算符的右操作數(shù),另一個操作數(shù)(左操作數(shù))是隱含的,是該類的當前對象,它是通過this指針隱含地傳遞給函數(shù)的。3.對于單目運算符而言,成員運算符重載函數(shù)的參數(shù)表中沒有參數(shù),此時當前對象作為運算符的一個操作數(shù)。5.2.4成員運算符重載函數(shù)與友元運算符重載函數(shù)的比較(1)對雙目運算符而言,成員運算符重載函數(shù)參數(shù)表中含有一個參數(shù),而友元運算符重載函數(shù)參數(shù)表中含有兩個參數(shù);(2)對于單目運算符而言,成員運算符重載函數(shù)的參數(shù)表中沒有參數(shù),而友元運算符重載函數(shù)參數(shù)表中含有一個參數(shù)。(3)雙目運算符一般可以被重載為友元運算符函數(shù)或成員運算符函數(shù),但以下情況必須使用友元函數(shù):將一個復數(shù)和一個整數(shù)相加Complexoperator+(inta){
return(real+a,imag);}若com和com1是類Complex的對象,則以下語句是對的:com1=com+100;//正確,+左側(cè)是類對象這條語句被解釋為:com1=com.operator+(100);然而以下語句就不起作用了:com1=100+com;//錯誤,+左側(cè)是整數(shù)這條語句被解釋為:com1=100.operator+(com);若用友元函數(shù)則不會出現(xiàn)這種情況。c+100成員函數(shù):c.operator+(100)友元函數(shù):operator(c,100)100+c成員函數(shù):100.operator+(c)友元函數(shù):operator+(100,c)(4)友元運算符函數(shù)和成員運算符函數(shù)的調(diào)用形式:表達式友元函數(shù)調(diào)用成員函數(shù)調(diào)用a+boperator+(a,b)a.operator+(b)++aoperator++(a)a.operator++()-aoperator-(a)a.operator-()(5)一般來說,單目運算符最好被重載為成員函數(shù),雙目運算符被重載為友元函數(shù)。運算符“=、()、[]、->”只能作為成員函數(shù);運算符“+=、-=、/=、*=、&=、!=、%=”建議重載為成員函數(shù)。
5.2.5“++”和“--”重載
增1減1運算符是單目運算符,它們又有前綴運算符和后綴運算符兩種。為了區(qū)分這兩種運算,將后綴運算視為雙目運算符,在參數(shù)表中插入int。運算符名成員函數(shù)形式調(diào)用形式等價調(diào)用前綴++Xoperator++()++aa.Operator++()后綴++Xoperator++(int)a++a.Operator++(0)前綴--Xoperator--()--aa.Operator--()后綴--Xoperator--(int)a--a.Operator--(0)例題:使用成員函數(shù)重載運算符“——”#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;//返回自減后的當前對象}ThreeThree::operator--(int){
Threetemp(*this);
i1--;i2--;i3--;
returntemp;//返回自減前的當前對象}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ù)重載運算符“十十”#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;//返回自減前的當前對象}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賦值運算符“=”重載對于任意一個類,如果用戶沒有定義賦值運算符函數(shù),那么系統(tǒng)將自動地為其生成一個默認的賦值運算符函數(shù),例如:X&X::operator=(constX&source){
//成員間賦值
}采用默認的賦值運算符函數(shù)實現(xiàn)的數(shù)據(jù)成員逐一賦值的方法是一種淺層復制方法,通常,默認的賦值運算符函數(shù)是能夠勝任工作的,但有些特殊情況下,如類中有指針類型時,使用缺省的賦值運算符函數(shù)會產(chǎn)生錯誤。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;}運行結(jié)果如下:ConstructorcalledConstructorcalledDestructorcalled.---bookDestructorcalled.—葺葺葺葺這是由于默認的賦值運算函數(shù)是淺層復制,只是改變指針指向,并沒有另開辟一塊新的內(nèi)存空間,使得第二次執(zhí)行析構函數(shù)時企圖釋放同一空間,導致對同一個內(nèi)存空間進行兩次釋放出錯。于是出現(xiàn)的所謂的“指針懸掛”現(xiàn)象.2.用深層復制解決指針懸掛問題#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)//定義賦值運算重載函數(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等.壓縮文件請下載最新的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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2022-2027年中國眼科OCT設備行業(yè)市場深度分析及投資戰(zhàn)略規(guī)劃報告
- 2025年中國布氏菌素行業(yè)市場深度研究及投資戰(zhàn)略規(guī)劃建議報告
- 2025年中國甘薯全粉行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 2024年兒童電影行業(yè)市場調(diào)查研究及發(fā)展戰(zhàn)略規(guī)劃報告
- 社區(qū)健康服務與心理援助的融合案例分析
- 社區(qū)集市型零售與文化傳播的融合研究
- 2025年中國球芯折角塞門市場調(diào)查研究報告
- 2025年中國玻璃切割機市場調(diào)查研究報告
- 2025年中國煤氣平爐市場調(diào)查研究報告
- 2025年中國淋浴房雙輪吊輪市場調(diào)查研究報告
- 2025年執(zhí)業(yè)醫(yī)師定期考核題庫及參考答案
- 2025年北京交通職業(yè)技術學院高職單招職業(yè)技能測試近5年常考版參考題庫含答案解析
- 心理健康七個一主題活動方案
- 多元化票務系統(tǒng)設計-深度研究
- 人教版地理七年級下冊7.1.1 亞洲的自然環(huán)境(課件33張)
- 《Python程序設計基礎教程(微課版)》全套教學課件
- 小學二年級數(shù)學下冊教材研說稿
- 薄弱學科、薄弱班級原因分析及改進措施課件資料
- 可編輯模板中國風春節(jié)喜慶信紙精選
- 小學生幽默搞笑相聲臺詞
- A4方格紙-無需排版直接打印完美版
評論
0/150
提交評論