最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++編程中的單目運(yùn)算符重載與雙目運(yùn)算符重載

 更新時間:2015年09月18日 15:55:48   投稿:goldensun  
這篇文章主要介紹了詳解C++編程中的單目運(yùn)算符重載與雙目運(yùn)算符重載,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下

C++單目運(yùn)算符重載
單目運(yùn)算符只有一個操作數(shù),如!a,-b,&c,*p,還有最常用的++i和--i等。重載單目運(yùn)算符的方法與重載雙目運(yùn)算符的方法是類似的。但由于單目運(yùn)算符只有一個操作數(shù),因此運(yùn)算符重載函數(shù)只有一個參數(shù),如果運(yùn)算符重載函數(shù)作為成員函數(shù),則還可省略此參數(shù)。

下面以自增運(yùn)算符”++“為例,介紹單目運(yùn)算符的重載。

[例] 有一個Time類,包含數(shù)據(jù)成員minute(分)和sec(秒),模擬秒表,每次走一秒,滿60秒進(jìn)一分鐘,此時秒又從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ù)
 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)算符,它們的作用是不一樣的,在重載時怎樣區(qū)別這二者呢?

針對“++”和“--”這一特點(diǎn),C++約定,在自增(自減)運(yùn)算符重載函數(shù)中,增加一個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)算符時,多了一個int型的參數(shù),增加這個參數(shù)只是為了與前置自增運(yùn)算符重載函數(shù)有所區(qū)別,此外沒有任何作用。編譯系統(tǒng)在遇到重載后置自增運(yùn)算符時,會自動調(diào)用此函數(shù)。

C++雙目運(yùn)算符重載
雙目運(yùn)算符(或稱二元運(yùn)算符)是C++中最常用的運(yùn)算符。雙目運(yùn)算符有兩個操作數(shù),通常在運(yùn)算符的左右兩側(cè),如3+5,a=b,i<10等。在重載雙目運(yùn)算符時,不言而喻在函數(shù)中應(yīng)該有兩個參數(shù)。

[例] 定義一個字符串類String,用來存放不定長的字符串,重載運(yùn)算符“==”、“<”和“>”,用于兩個字符串的等于、小于和大于的比較運(yùn)算。

為了使讀者便于理解程序,同時也使讀者了解建立程序的步驟,下面分幾步來介紹編程過程:
1) 先建立一個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) 有了這個基礎(chǔ)后,再增加其他必要的內(nèi)容。現(xiàn)在增加對運(yùn)算符重載的部分。為便于編寫和調(diào)試,先重載一個運(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。

這只是一個并不很完善的程序,但是,已經(jīng)完成了實(shí)質(zhì)性的工作了,運(yùn)算符重載成功了。其他兩個運(yùn)算符的重載如法炮制即可。

3) 擴(kuò)展到對3個運(yùn)算符重載。
在String類體中聲明3個成員函數(shù):
 

 friend bool operator> (String &string1, String &string2);
 friend bool operator< (String &string1, String &string2);
 friend bool operator==(String &string1, String& string2);

在類外分別定義3個運(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

增加了一個compare函數(shù),用來對兩個字符串進(jìn)行比較,并輸出相應(yīng)的信息。這樣可以減輕主函數(shù)的負(fù)擔(dān),使主函數(shù)簡明易讀。

通過這個例子,不僅可以學(xué)習(xí)到有關(guān)雙目運(yùn)算符重載的知識,而且還可以學(xué)習(xí)怎樣去編寫C++程序。由于C ++程序包含類,一般都比較長,有的初學(xué)C++的讀者見到比較長的程序就發(fā)怵,不知該怎樣著手去閱讀和分析它。輪到自己編程序,更不知道從何入 手,往往未經(jīng)深思熟慮,想到什么就寫什么,一口氣把程序?qū)懥顺鰜?,結(jié)果一運(yùn)行,錯 誤百出,光為找出錯位置就花費(fèi)了大量的時間。根據(jù)許多初學(xué)者的經(jīng)驗(yàn),上面介紹的方法是很適合沒有編程經(jīng)驗(yàn)的初學(xué)者的,能使人以清晰的思路進(jìn)行程序設(shè)計(jì),減少出錯機(jī)會, 提高調(diào)試效率。

這種方法的指導(dǎo)思想是:先搭框架,逐步擴(kuò)充,由簡到繁,最后完善。邊編程,邊調(diào)試,邊擴(kuò)充。千萬不要企圖在一開始時就解決所有的細(xì)節(jié)。類是可擴(kuò)充的,可以一步一步地?cái)U(kuò)充它的功能。最好直接在計(jì)算機(jī)上寫程序,每一步都要上機(jī)調(diào)試,調(diào)試通過了前面一步再做下一步,步步為營。這樣編程和調(diào)試的效率是比較高的。大家可以試驗(yàn)一下。

相關(guān)文章

  • C++基礎(chǔ)入門教程(六):為什么創(chuàng)建類的時候要用new?

    C++基礎(chǔ)入門教程(六):為什么創(chuàng)建類的時候要用new?

    這篇文章主要介紹了C++基礎(chǔ)入門教程(六):為什么創(chuàng)建類的時候要用new?本文講解了使用new創(chuàng)建動態(tài)結(jié)構(gòu)體、為什么要有new、自動存儲(自動變量、局部變量)、動態(tài)存儲、vector和array等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • C++實(shí)現(xiàn)通訊錄系統(tǒng)項(xiàng)目實(shí)戰(zhàn)

    C++實(shí)現(xiàn)通訊錄系統(tǒng)項(xiàng)目實(shí)戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)通訊錄系統(tǒng)項(xiàng)目實(shí)戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言代碼實(shí)現(xiàn)推箱子小游戲

    C語言代碼實(shí)現(xiàn)推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言代碼實(shí)現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • VC6.0實(shí)現(xiàn)讀取Excel數(shù)據(jù)的方法

    VC6.0實(shí)現(xiàn)讀取Excel數(shù)據(jù)的方法

    這篇文章主要介紹了VC6.0實(shí)現(xiàn)讀取Excel數(shù)據(jù)的方法,非常實(shí)用的功能,需要的朋友可以參考下
    2014-07-07
  • C語言中有哪些字符處理函數(shù)你知道嗎

    C語言中有哪些字符處理函數(shù)你知道嗎

    這篇文章主要為大家詳細(xì)介紹了C語言字符處理函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++ 中malloc()和free()函數(shù)的理解

    C++ 中malloc()和free()函數(shù)的理解

    這篇文章主要介紹了C++ 中malloc()和free()函數(shù)的理解的相關(guān)資料,這里提供用法示例幫助大家理解這部分知識,需要的朋友可以參考下
    2017-08-08
  • 詳解進(jìn)程同步與互斥機(jī)制

    詳解進(jìn)程同步與互斥機(jī)制

    進(jìn)程同步是一個操作系統(tǒng)級別的概念,是在多道程序的環(huán)境下,存在著不同的制約關(guān)系,為了協(xié)調(diào)這種互相制約的關(guān)系,實(shí)現(xiàn)資源共享和進(jìn)程協(xié)作,從而避免進(jìn)程之間的沖突,引入了進(jìn)程同步
    2021-06-06
  • 二叉搜索樹源碼分享

    二叉搜索樹源碼分享

    這篇文章主要介紹了二叉搜索樹源碼,需要的朋友可以參考下
    2014-04-04
  • C語言實(shí)現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷詳解

    C語言實(shí)現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷詳解

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++修煉之拷貝構(gòu)造函數(shù)

    C++修煉之拷貝構(gòu)造函數(shù)

    這篇文章主要內(nèi)容是6個默認(rèn)成員函數(shù)之一的拷貝構(gòu)造函數(shù)的認(rèn)識與學(xué)習(xí),讓同學(xué)們充分理解淺拷貝與深拷貝,感興趣的小伙伴可以參考閱讀
    2023-04-04

最新評論

江川县| 武宁县| 丹东市| 夏邑县| 富蕴县| 安岳县| 河曲县| 玛纳斯县| 大厂| 琼中| 西乌| 海宁市| 陇川县| 若尔盖县| 江口县| 屏南县| 府谷县| 阿拉善右旗| 哈尔滨市| 昌乐县| 洛宁县| 横山县| 龙游县| 苍溪县| 北宁市| 汉阴县| 元朗区| 称多县| 江孜县| 海晏县| 平凉市| 龙川县| 连南| 罗田县| 区。| 高青县| 东安县| 乐清市| 休宁县| 兴义市| 耿马|