通過構造函數簡化“+”運算符重載

     很久沒有寫日記了,今天晚上翻了翻原來學習c++的一些總結,下面運算符重載的一點小知識,對初學者還是有點用的,就貼上來吧!我忘了這個例子是不是我親自寫的了,如有侵權,請多包涵,大家分享知識,呵呵!

當一個類對象和其他類型的數相加的時候,一般會爲每一個種情況寫一個重載運算符函數,這樣很麻煩,我們可以利用構造函數進行隱式的轉化。
我們可以利用類構造函數對參與運算的整型對象進行顯式的類型轉換,從而生成無名對象參與同類型對象的加運算,這樣做可以縮減代碼量,提高程序的可讀性
#include<iostream>
using namespace std;

class RMB
{
public:
 RMB(double value);
 RMB(unsigned int d, unsigned int c)
 {
  yuan  = d;
  jf = c;
  while (jf >=100)
  {
   yuan ++;
   jf -= 100;
  }
 }
// RMB operator + (const RMB& s);
// friend RMB operator + (const RMB& s, double d);
// friend inline RMB operator + (double d, const RMB& s);
 friend RMB operator + (const RMB& s1, const RMB& s2);
 void display()
 {
  cout << (yuan + jf / 100.0) << endl;
 }
protected:
 unsigned int yuan;
 unsigned int jf;
};

RMB::RMB(double value)
{
 RMB::yuan = value;
 RMB::jf = (value - RMB::yuan) * 100.0 + 0.5;
}
/*
RMB RMB::operator + (const RMB& s)
{
 unsigned int jf0 = jf + s.jf;
 unsigned int yuan0 = yuan + s.yuan;
 RMB result(yuan0, jf0);
 return result;
}


RMB operator + (const RMB& s, double d)
{
 unsigned int y = s.yuan + d;
 unsigned int j = s.jf + (d - (int)d) * 100 + 0.5;
 RMB result(y, j);
 return result;
}

inline RMB operator + (double d, RMB& s)
{
 return s + d;
}
*/

RMB operator + (const RMB& s1, const RMB& s2) //這裏必須是友員函數
{
 unsigned int y = s1.yuan + s2.yuan;
 unsigned int j = s1.jf + s2.jf;
 RMB result(y, j);
 return result;
}


int main()
{
 RMB s(5.8);
 s = RMB(1.5) + s;
 s.display();
 
 s = 1.5 + s;
 s.display();
 s = s + 1.5;  //此處進行隱式轉化
 s.display();
 s = s + 1;
 s.display();
 s = 4+1.5;//先進行4+1.5的內置double型加法,然後在調用s = RMB(5.5)的隱式轉化
 s.display();
 
 return 0;
}
類的構造函數起了顯式或者隱式轉換的作用,轉換過程實質是產生一個類的無名對象,類的運算符重載函數的參數就是這個無名對象的引用,所以參數的順序也不再是問題,代碼的運行效率也得到提高,無需再定義只是參數順序不同,內容重複的運算符重載函數了。


另外,c++中規定: =,(),[],->這四種運算符必須是成員形式。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章