程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解C++編程中的單目運算符重載與雙目運算符重載

詳解C++編程中的單目運算符重載與雙目運算符重載

編輯:關於C++

詳解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++的讀者見到比擬長的法式就發怵,不知該如何著手去浏覽和剖析它。輪到本身編法式,更不曉得從何入 手,常常未經沉思熟慮,想到甚麼就寫甚麼,一口吻把法式寫了出來,成果一運轉,錯 誤百出,光為找失足地位就消費了年夜量的時光。依據很多初學者的經歷,下面引見的辦法是很合適沒有編程經歷的初學者的,能令人以清楚的思緒停止法式設計,削減失足機遇, 進步調試效力。

這類辦法的指點思惟是:先搭框架,慢慢擴大,由簡到繁,最初完美。邊編程,邊調試,邊擴大。萬萬不要妄圖在一開端時就處理一切的細節。類是可擴大的,可以一步一步地擴大它的功效。最好直接在盤算機上寫法式,每步都要上機調試,調試經由過程了後面一步再做下一步,穩扎穩打。如許編程和調試的效力是比擬高的。年夜家可以實驗一下。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved