1.1.12_C++ 重載運算符和重載函數(shù)

C++ 允許在同一作用域中的某個函數(shù)和運算符指定多個定義锄开,分別稱為函數(shù)重載和運算符重載古沥。

重載聲明是指一個與之前已經(jīng)在該作用域內(nèi)聲明過的函數(shù)或方法具有相同名稱的聲明瘸右,但是它們的參數(shù)列表和定義(實現(xiàn))不相同娇跟。

當您調(diào)用一個重載函數(shù)或重載運算符時,編譯器通過把您所使用的參數(shù)類型與定義中的參數(shù)類型進行比較太颤,決定選用最合適的定義苞俘。選擇最合適的重載函數(shù)或重載運算符的過程,稱為重載決策龄章。

C++ 中的函數(shù)重載

在同一個作用域內(nèi)吃谣,可以聲明幾個功能類似的同名函數(shù),但是這些同名函數(shù)的形式參數(shù)(指參數(shù)的個數(shù)做裙、類型或者順序)必須不同岗憋。您不能僅通過返回類型的不同來重載函數(shù)。

下面的實例中锚贱,同名函數(shù) print() 被用于輸出不同的數(shù)據(jù)類型:
實例

#include <iostream>
using namespace std;
 
class printData 
{
   public:
      void print(int i) {
        cout << "Printing int: " << i << endl;
      }
 
      void print(double  f) {
        cout << "Printing float: " << f << endl;
      }
 
      void print(char* c) {
        cout << "Printing character: " << c << endl;
      }
};
 
int main(void)
{
   printData pd;
 
   // Call print to print integer
   pd.print(5);
   // Call print to print float
   pd.print(500.263);
   // Call print to print character
   pd.print("Hello C++");
 
   return 0;
}

當上面的代碼被編譯和執(zhí)行時仔戈,它會產(chǎn)生下列結(jié)果:

Printing int: 5
Printing float: 500.263
Printing character: Hello C++

C++ 中的運算符重載

您可以重定義或重載大部分 C++ 內(nèi)置的運算符。這樣拧廊,您就能使用自定義類型的運算符监徘。

重載的運算符是帶有特殊名稱的函數(shù),函數(shù)名是由關鍵字 operator 和其后要重載的運算符符號構(gòu)成的吧碾。與其他函數(shù)一樣凰盔,重載運算符有一個返回類型和一個參數(shù)列表。

Box operator+(const Box&);

聲明加法運算符用于把兩個 Box 對象相加倦春,返回最終的 Box 對象户敬。大多數(shù)的重載運算符可被定義為普通的非成員函數(shù)或者被定義為類成員函數(shù)。

如果我們定義上面的函數(shù)為類的非成員函數(shù)溅漾,那么我們需要為每次操作傳遞兩個參數(shù)山叮,如下所示:

Box operator+(const Box&, const Box&);

下面的實例使用成員函數(shù)演示了運算符重載的概念著榴。在這里添履,對象作為參數(shù)進行傳遞,對象的屬性使用 this 運算符進行訪問脑又,如下所示:
實例

#include <iostream>
using namespace std;
 
class Box
{
   public:
 
      double getVolume(void)
      {
         return length * breadth * height;
      }

      void setLength( double len )
      {
          length = len;
      }
 
      void setBreadth( double bre )
      {
          breadth = bre;
      }
 
      void setHeight( double hei )
      {
          height = hei;
      }

      // 重載 + 運算符暮胧,用于把兩個 Box 對象相加
      Box operator+(const Box& b)
      {
         Box box;
         box.length = this->length + b.length;
         box.breadth = this->breadth + b.breadth;
         box.height = this->height + b.height;
         return box;
      }

   private:
      double length;      // 長度
      double breadth;     // 寬度
      double height;      // 高度
};

// 程序的主函數(shù)
int main( )
{
   Box Box1;                // 聲明 Box1,類型為 Box
   Box Box2;                // 聲明 Box2问麸,類型為 Box
   Box Box3;                // 聲明 Box3往衷,類型為 Box
   double volume = 0.0;     // 把體積存儲在該變量中
 
   // Box1 詳述
   Box1.setLength(6.0); 
   Box1.setBreadth(7.0); 
   Box1.setHeight(5.0);
 
   // Box2 詳述
   Box2.setLength(12.0); 
   Box2.setBreadth(13.0); 
   Box2.setHeight(10.0);
 
   // Box1 的體積
   volume = Box1.getVolume();
   cout << "Volume of Box1 : " << volume <<endl;
 
   // Box2 的體積
   volume = Box2.getVolume();
   cout << "Volume of Box2 : " << volume <<endl;
 
   // 把兩個對象相加,得到 Box3
   Box3 = Box1 + Box2;
 
   // Box3 的體積
   volume = Box3.getVolume();
   cout << "Volume of Box3 : " << volume <<endl;
 
   return 0;
}

當上面的代碼被編譯和執(zhí)行時严卖,它會產(chǎn)生下列結(jié)果:

Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400

可重載運算符/不可重載運算符

下面是可重載的運算符列表:

+  -  *  /  %  ^
&  |  ~  !  ,  =
<  >  <= >= ++ --
<< >> == != && ||
+= -= /= %= ^= &=
|= *= <<=   >>=   [] ()
-> ->*   new   new []   delete   delete []

下面是不可重載的運算符列表:

:: .* .  ?:

運算符重載實例

下面提供了各種運算符重載的實例席舍,幫助您更好地理解重載的概念。
序號 運算符和實例

  1. 一元運算符重載
  2. 二元運算符重載
  3. 關系運算符重載
  4. 輸入/輸出運算符重載
  5. ++ 和 -- 運算符重載
  6. 賦值運算符重載
  7. 函數(shù)調(diào)用運算符 () 重載
  8. 下標運算符 [] 重載
  9. 類成員訪問運算符 -> 重載

代碼鏈接:https://github.com/karst87/cpp/tree/master/learning/com.runoob

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哮笆,一起剝皮案震驚了整個濱河市来颤,隨后出現(xiàn)的幾起案子汰扭,更是在濱河造成了極大的恐慌,老刑警劉巖福铅,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萝毛,死亡現(xiàn)場離奇詭異,居然都是意外死亡滑黔,警方通過查閱死者的電腦和手機笆包,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來略荡,“玉大人庵佣,你說我怎么就攤上這事⊙炊担” “怎么了秧了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長序无。 經(jīng)常有香客問我验毡,道長,這世上最難降的妖魔是什么帝嗡? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任晶通,我火速辦了婚禮,結(jié)果婚禮上哟玷,老公的妹妹穿的比我還像新娘狮辽。我一直安慰自己,他們只是感情好巢寡,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布喉脖。 她就那樣靜靜地躺著,像睡著了一般抑月。 火紅的嫁衣襯著肌膚如雪树叽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天谦絮,我揣著相機與錄音题诵,去河邊找鬼。 笑死层皱,一個胖子當著我的面吹牛性锭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叫胖,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼草冈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起怎棱,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤方淤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蹄殃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體携茂,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年诅岩,在試婚紗的時候發(fā)現(xiàn)自己被綠了讳苦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡吩谦,死狀恐怖鸳谜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情式廷,我是刑警寧澤咐扭,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站滑废,受9級特大地震影響蝗肪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蠕趁,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一薛闪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俺陋,春花似錦豁延、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缴挖,卻和暖如春袋狞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背醇疼。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工硕并, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留法焰,地道東北人秧荆。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像埃仪,于是被迫代替她去往敵國和親乙濒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容