詳解C++編程中的單目運(yùn)算符重載與雙目運(yùn)算符重載
C++單目運(yùn)算符重載
單目運(yùn)算符只有一個(gè)操作數(shù),如!a,-b,&c,*p,還有最常用的++i和--i等。重載單目運(yùn)算符的方法與重載雙目運(yùn)算符的方法是類似的。但由于單目運(yùn)算符只有一個(gè)操作數(shù),因此運(yùn)算符重載函數(shù)只有一個(gè)參數(shù),如果運(yùn)算符重載函數(shù)作為成員函數(shù),則還可省略此參數(shù)。
下面以自增運(yùn)算符”++“為例,介紹單目運(yùn)算符的重載。
[例] 有一個(gè)Time類,包含數(shù)據(jù)成員minute(分)和sec(秒),模擬秒表,每次走一秒,滿60秒進(jìn)一分鐘,此時(shí)秒又從0開始算。要求輸出分和秒的值。
#include <iostream> using namespace std; class Time { public: Time( ){minute=0;sec=0;} //默認(rèn)構(gòu)造函數(shù) Time(int m,int s):minute(m),sec(s){ } //構(gòu)造函數(shù)重載 Time operator++( ); //聲明運(yùn)算符重載函數(shù) void display( ){cout<<minute<<":"<<sec<<endl;} //定義輸出時(shí)間函數(shù) private: int minute; int sec; }; Time Time::operator++( ) //定義運(yùn)算符重載函數(shù) { if(++sec>=60) { sec-=60; //滿60秒進(jìn)1分鐘 ++minute; } return *this; //返回當(dāng)前對象值 } int main( ) { Time time1(34,0); for (int i=0;i<61;i++) { ++time1; time1.display( ); } return 0; }
運(yùn)行情況如下:
34:1 34:2 ┆ 34:59 35:0 35:1 (共輸出61行)
可以看到:在程序中對運(yùn)算符“++”進(jìn)行了重載,使它能用于Time類對象?!?+”和“--”運(yùn)算符有兩種使用方式,前置自增運(yùn)算符和后置自增運(yùn)算符,它們的作用是不一樣的,在重載時(shí)怎樣區(qū)別這二者呢?
針對“++”和“--”這一特點(diǎn),C++約定,在自增(自減)運(yùn)算符重載函數(shù)中,增加一個(gè)int型形參,就是后置自增(自減)運(yùn)算符函數(shù)。
[例] 在上面例子程序的基礎(chǔ)上增加對后置自增運(yùn)算符的重載。修改后的程序如下:
#include <iostream> using namespace std; class Time { public: Time( ){minute=0;sec=0;} Time(int m,int s):minute(m),sec(s){} Time operator++( );//聲明前置自增運(yùn)算符“++”重載函數(shù) Time operator++(int);//聲明后置自增運(yùn)算符“++”重載函數(shù) void display( ){cout<<minute<<":"<<sec<<endl;} private: int minute; int sec; }; Time Time::operator++( )//定義前置自增運(yùn)算符“++”重載函數(shù) { if(++sec>=60) { sec-=60; ++minute; } return *this;//返回自加后的當(dāng)前對象 } Time Time::operator++(int)//定義后置自增運(yùn)算符“++”重載函數(shù) { Time temp(*this); sec++; if(sec>=60) { sec-=60; ++minute; } return temp; //返回的是自加前的對象 } int main( ) { Time time1(34,59),time2; cout<<" time1 : "; time1.display( ); ++time1; cout<<"++time1: "; time1.display( ); time2=time1++; //將自加前的對象的值賦給time2 cout<<"time1++: "; time1.display( ); cout<<" time2 :"; time2.display( ); //輸出time2對象的值 }
請注意前置自增運(yùn)算符“++”和后置自增運(yùn)算符“++”二者作用的區(qū)別。前者是先自加,返回的是修改后的對象本身。后者返回的是自加前的對象,然后對象自加。請仔細(xì)分析后置自增運(yùn)算符重載函數(shù)。
運(yùn)行結(jié)果如下:
time1 : 34:59(time1原值) ++time1: 35:0 (執(zhí)行++time1后time1的值) time1++: 35:1 (再執(zhí)行time1++后time1的值) time2 : 35:0 (time2保存的是執(zhí)行time1++前time1的值)
可以看到,重載后置自增運(yùn)算符時(shí),多了一個(gè)int型的參數(shù),增加這個(gè)參數(shù)只是為了與前置自增運(yùn)算符重載函數(shù)有所區(qū)別,此外沒有任何作用。編譯系統(tǒng)在遇到重載后置自增運(yùn)算符時(shí),會自動調(diào)用此函數(shù)。
C++雙目運(yùn)算符重載
雙目運(yùn)算符(或稱二元運(yùn)算符)是C++中最常用的運(yùn)算符。雙目運(yùn)算符有兩個(gè)操作數(shù),通常在運(yùn)算符的左右兩側(cè),如3+5,a=b,i<10等。在重載雙目運(yùn)算符時(shí),不言而喻在函數(shù)中應(yīng)該有兩個(gè)參數(shù)。
[例] 定義一個(gè)字符串類String,用來存放不定長的字符串,重載運(yùn)算符“==”、“<”和“>”,用于兩個(gè)字符串的等于、小于和大于的比較運(yùn)算。
為了使讀者便于理解程序,同時(shí)也使讀者了解建立程序的步驟,下面分幾步來介紹編程過程:
1) 先建立一個(gè)String類:
#include <iostream> using namespace std; class String { public: String( ){p=NULL;} //默認(rèn)構(gòu)造函數(shù) String(char *str); //構(gòu)造函數(shù) void display( ); private: char *p;//字符型指針,用于指向字符串 }; String::String(char *str) //定義構(gòu)造函數(shù) {p=str;} //使p指向?qū)崊⒆址? void String::display( ) //輸出p所指向的字符串 {cout<<p;} int main( ) { String string1("Hello"),string2("Book"); string1.display( ); cout<<endl; string2.display( ); return 0; }
運(yùn)行結(jié)果為:
Hello Book
2) 有了這個(gè)基礎(chǔ)后,再增加其他必要的內(nèi)容?,F(xiàn)在增加對運(yùn)算符重載的部分。為便于編寫和調(diào)試,先重載一個(gè)運(yùn)算符“>”。程序如下:
#include <iostream> #include <string> using namespace std; class String { public: String( ){p=NULL;} String(char *str); friend bool operator>(String &string1,String &string2);//聲明運(yùn)算符函數(shù)為友元函數(shù) void display( ); private: char *p;//字符型指針,用于指向字符串 }; String::String(char *str) {p=str;} void String::display( ) //輸出p所指向的字符串 {cout<<p;} bool operator>(String &string1,String &string2)//定義運(yùn)算符重載函數(shù) { if(strcmp(string1.p,string2.p)>0) return true; else return false; } int main( ) { String string1("Hello"),string2("Book"); cout<<(string1>string2)<<endl; }
程序運(yùn)行結(jié)果為1。
這只是一個(gè)并不很完善的程序,但是,已經(jīng)完成了實(shí)質(zhì)性的工作了,運(yùn)算符重載成功了。其他兩個(gè)運(yùn)算符的重載如法炮制即可。
3) 擴(kuò)展到對3個(gè)運(yùn)算符重載。
在String類體中聲明3個(gè)成員函數(shù):
friend bool operator> (String &string1, String &string2); friend bool operator< (String &string1, String &string2); friend bool operator==(String &string1, String& string2);
在類外分別定義3個(gè)運(yùn)算符重載函數(shù):
bool operator>(String &string1,String &string2) //對運(yùn)算符“>”重載 { if(strcmp(string1.p,string2.p)>0) return true; else return false; } bool operator<(String &string1,String &string2) //對運(yùn)算符“<”重載 { if(strcmp(string1.p,string2.p)<0) return true; else return false; } bool operator==(String &string1,String &string2) //對運(yùn)算符“==”重載 { if(strcmp(string1.p,string2.p)==0) return true; else return false; }
再修改主函數(shù):
int main( ) { String string1("Hello"), string2("Book"), string3("Computer"); cout<<(string1>string2)<<endl; //比較結(jié)果應(yīng)該為true cout<<(string1<string3)<<endl; //比較結(jié)果應(yīng)該為false cout<<(string1==string2)<<endl; //比較結(jié)果應(yīng)該為false return 0; }
運(yùn)行結(jié)果為:
1 0 0
結(jié)果顯然是對的。到此為止,主要任務(wù)基本完成。
4) 再進(jìn)一步修飾完善,使輸出結(jié)果更直觀。下面給出最后的程序。
#include <iostream> using namespace std; class String { public: String( ){p=NULL;} String(char *str); friend bool operator>(String &string1, String &string2); friend bool operator<(String &string1, String &string2); friend bool operator==(String &string1, String &string2); void display( ); private: char *p; }; String::String(char *str) {p=str;} void String::display( ) //輸出p所指向的字符串 {cout<<p;} bool operator>(String &string1, String &string2) { if(strcmp(string1.p, string2.p)>0) return true; else return false; } bool operator<(String &string1, String &string2) { if(strcmp(string1.p, string2.p)<0) return true; else return false; } bool operator==(String &string1, String &string2) { if(strcmp(string1.p, string2.p)==0) return true; else return false; } void compare(String &string1, String &string2) { if(operator>(string1, string2)==1) {string1.display( );cout<<">";string2.display( );} else if(operator<(string1, string2)==1) {string1.display( );cout<<"<";string2.display( );} else if(operator==(string1, string2)==1) {string1.display( );cout<<"=";string2.display( );} cout<<endl; } int main( ) { String string1("Hello"), string2("Book"), string3("Computer"), string4("Hello"); compare(string1, string2); compare(string2, string3); compare(string1, string4); return 0; }
運(yùn)行結(jié)果為:
Hello>Book Book<Computer Hello==Hello
增加了一個(gè)compare函數(shù),用來對兩個(gè)字符串進(jìn)行比較,并輸出相應(yīng)的信息。這樣可以減輕主函數(shù)的負(fù)擔(dān),使主函數(shù)簡明易讀。
通過這個(gè)例子,不僅可以學(xué)習(xí)到有關(guān)雙目運(yùn)算符重載的知識,而且還可以學(xué)習(xí)怎樣去編寫C++程序。由于C ++程序包含類,一般都比較長,有的初學(xué)C++的讀者見到比較長的程序就發(fā)怵,不知該怎樣著手去閱讀和分析它。輪到自己編程序,更不知道從何入 手,往往未經(jīng)深思熟慮,想到什么就寫什么,一口氣把程序?qū)懥顺鰜恚Y(jié)果一運(yùn)行,錯(cuò) 誤百出,光為找出錯(cuò)位置就花費(fèi)了大量的時(shí)間。根據(jù)許多初學(xué)者的經(jīng)驗(yàn),上面介紹的方法是很適合沒有編程經(jīng)驗(yàn)的初學(xué)者的,能使人以清晰的思路進(jìn)行程序設(shè)計(jì),減少出錯(cuò)機(jī)會, 提高調(diào)試效率。
這種方法的指導(dǎo)思想是:先搭框架,逐步擴(kuò)充,由簡到繁,最后完善。邊編程,邊調(diào)試,邊擴(kuò)充。千萬不要企圖在一開始時(shí)就解決所有的細(xì)節(jié)。類是可擴(kuò)充的,可以一步一步地?cái)U(kuò)充它的功能。最好直接在計(jì)算機(jī)上寫程序,每一步都要上機(jī)調(diào)試,調(diào)試通過了前面一步再做下一步,步步為營。這樣編程和調(diào)試的效率是比較高的。大家可以試驗(yàn)一下。
上一篇:C++編程中的格式化輸出詳解
欄 目:C語言
下一篇:深入解析C++中派生類的構(gòu)造函數(shù)
本文標(biāo)題:詳解C++編程中的單目運(yùn)算符重載與雙目運(yùn)算符重載
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2701.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10如何查看進(jìn)程實(shí)際的內(nèi)存占用情況詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改