詳解C++編程中的單目運算符重載與雙目運算符重載。本站提示廣大學習愛好者:(詳解C++編程中的單目運算符重載與雙目運算符重載)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++編程中的單目運算符重載與雙目運算符重載正文
C++單目運算符重載
單目運算符只要一個操作數,如!a,-b,&c,*p,還有最經常使用的++i和--i等。重載單目運算符的辦法與重載雙目運算符的辦法是相似的。但因為單目運算符只要一個操作數,是以運算符重載函數只要一個參數,假如運算符重載函數作為成員函數,則還可省略此參數。
上面以自增運算符”++“為例,引見單目運算符的重載。
[例] 有一個Time類,包括數據成員minute(分)和sec(秒),模仿秒表,每次走一秒,滿60秒進一分鐘,此時秒又從0開端算。請求輸入分和秒的值。
#include <iostream> using namespace std; class Time { public: Time( ){minute=0;sec=0;} //默許結構函數 Time(int m,int s):minute(m),sec(s){ } //結構函數重載 Time operator++( ); //聲明運算符重載函數 void display( ){cout<<minute<<":"<<sec<<endl;} //界說輸入時光函數 private: int minute; int sec; }; Time Time::operator++( ) //界說運算符重載函數 { if(++sec>=60) { sec-=60; //滿60秒進1分鐘 ++minute; } return *this; //前往以後對象值 } int main( ) { Time time1(34,0); for (int i=0;i<61;i++) { ++time1; time1.display( ); } return 0; }
運轉情形以下:
34:1 34:2 ┆ 34:59 35:0 35:1 (共輸入61行)
可以看到:在法式中對運算符“++”停止了重載,使它能用於Time類對象。“++”和“--”運算符有兩種應用方法,前置自增運算符和後置自增運算符,它們的感化是紛歧樣的,在重載時如何差別這兩者呢?
針對“++”和“--”這一特色,C++商定,在自增(自減)運算符重載函數中,增長一個int型形參,就是後置自增(自減)運算符函數。
[例] 在下面例子法式的基本上增長對後置自增運算符的重載。修正後的法式以下:
#include <iostream> using namespace std; class Time { public: Time( ){minute=0;sec=0;} Time(int m,int s):minute(m),sec(s){} Time operator++( );//聲明前置自增運算符“++”重載函數 Time operator++(int);//聲明後置自增運算符“++”重載函數 void display( ){cout<<minute<<":"<<sec<<endl;} private: int minute; int sec; }; Time Time::operator++( )//界說前置自增運算符“++”重載函數 { if(++sec>=60) { sec-=60; ++minute; } return *this;//前往自加後確當前對象 } Time Time::operator++(int)//界說後置自增運算符“++”重載函數 { 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對象的值 }
請留意前置自增運算符“++”和後置自增運算符“++”兩者感化的差別。前者是先自加,前往的是修正後的對象自己。後者前往的是自加前的對象,然後對象自加。請細心剖析後置自增運算符重載函數。
運轉成果以下:
time1 : 34:59(time1原值) ++time1: 35:0 (履行++time1後time1的值) time1++: 35:1 (再履行time1++後time1的值) time2 : 35:0 (time2保留的是履行time1++前time1的值)
可以看到,重載後置自增運算符時,多了一個int型的參數,增長這個參數只是為了與前置自增運算符重載函數有所差別,另外沒有任何感化。編譯體系在碰到重載後置自增運算符時,會主動挪用此函數。
C++雙目運算符重載
雙目運算符(或稱二元運算符)是C++中最經常使用的運算符。雙目運算符有兩個操作數,平日在運算符的閣下兩側,如3+5,a=b,i<10等。在重載雙目運算符時,不問可知在函數中應當有兩個參數。
[例] 界說一個字符串類String,用來寄存不定長的字符串,重載運算符“==”、“<”和“>”,用於兩個字符串的等於、小於和年夜於的比擬運算。
為了使讀者便於懂得法式,同時也使讀者懂得樹立法式的步調,上面分幾步來引見編程進程:
1) 先樹立一個String類:
#include <iostream> using namespace std; class String { public: String( ){p=NULL;} //默許結構函數 String(char *str); //結構函數 void display( ); private: char *p;//字符型指針,用於指向字符串 }; String::String(char *str) //界說結構函數 {p=str;} //使p指向實參字符串 void String::display( ) //輸入p所指向的字符串 {cout<<p;} int main( ) { String string1("Hello"),string2("Book"); string1.display( ); cout<<endl; string2.display( ); return 0; }
運轉成果為:
Hello Book
2) 有了這個基本後,再增長其他需要的內容。如今增長對運算符重載的部門。為便於編寫和調試,先重載一個運算符“>”。法式以下:
#include <iostream> #include <string> using namespace std; class String { public: String( ){p=NULL;} String(char *str); 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; } int main( ) { String string1("Hello"),string2("Book"); cout<<(string1>string2)<<endl; }
法式運轉成果為1。
這只是一個其實不很完美的法式,然則,曾經完成了本質性的任務了,運算符重載勝利了。其他兩個運算符的重載依樣畫葫蘆便可。
3) 擴大到對3個運算符重載。
在String類體中聲明3個成員函數:
friend bool operator> (String &string1, String &string2); friend bool operator< (String &string1, String &string2); friend bool operator==(String &string1, String& string2);
在類外分離界說3個運算符重載函數:
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; }
再修正主函數:
int main( ) { String string1("Hello"), string2("Book"), string3("Computer"); cout<<(string1>string2)<<endl; //比擬成果應當為true cout<<(string1<string3)<<endl; //比擬成果應當為false cout<<(string1==string2)<<endl; //比擬成果應當為false return 0; }
運轉成果為:
1 0 0
成果明顯是對的。到此為止,重要義務根本完成。
4) 再進一步潤飾完美,使輸入成果更直不雅。上面給出最初的法式。
#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; }
運轉成果為:
Hello>Book Book<Computer Hello==Hello
增長了一個compare函數,用來對兩個字符串停止比擬,並輸入響應的信息。如許可以加重主函數的累贅,使主函數簡明易讀。
經由過程這個例子,不只可以進修到有關雙目運算符重載的常識,並且還可以進修如何去編寫C++法式。因為C ++法式包括類,普通都比擬長,有的初學C++的讀者見到比擬長的法式就發怵,不知該如何著手去浏覽和剖析它。輪到本身編法式,更不曉得從何入 手,常常未經沉思熟慮,想到甚麼就寫甚麼,一口吻把法式寫了出來,成果一運轉,錯 誤百出,光為找失足地位就消費了年夜量的時光。依據很多初學者的經歷,下面引見的辦法是很合適沒有編程經歷的初學者的,能令人以清楚的思緒停止法式設計,削減失足機遇, 進步調試效力。
這類辦法的指點思惟是:先搭框架,慢慢擴大,由簡到繁,最初完美。邊編程,邊調試,邊擴大。萬萬不要妄圖在一開端時就處理一切的細節。類是可擴大的,可以一步一步地擴大它的功效。最好直接在盤算機上寫法式,每步都要上機調試,調試經由過程了後面一步再做下一步,穩扎穩打。如許編程和調試的效力是比擬高的。年夜家可以實驗一下。