C++ 不具備繼承關係的類之間的顯式,隱式轉換 2013-07-11 15:41

很久沒有寫blog了,今天在學習c#的時候看到某一章節 講類的隱式與顯式轉換。特此留筆,以供後續參考之用。c#

        關於顯式,隱式轉換有些爭論,說什麼不建議隱式轉換。可是我的認爲非必要,若是有良好的基礎書寫基礎,那麼隱式和顯式轉換是沒有區別的,反卻是隱式轉換更方便。函數

        先說顯式轉換 如今有類CPoint 和類CRect;把CRect 對象強制轉換爲CPoint類型的對象。學習

實現思路是:重載CPoint的構造函數,既重載參數爲CRect類型的構造參數便可,此時explicit 無關緊要,可是我的建議有explicit關鍵字,有的話必須強轉。這樣能培養良好的書寫規範。如CPoint obj = (CRect)rect;比CPoint obj = rect 的可讀性要好。若是沒有explicit關鍵字,則屬於隱式轉換了。spa

僞代碼:explicit CPoint(const CRect& obj)這是顯式強轉; CPoint(const CRect& obj) 屬於隱式轉換的一種。我的喜歡第一種書寫方式對象

把CRect 對象隱式轉換爲CPoint類型的對象。blog

(1) 重載CPoint的構造函數,參數爲CRect類型,可是構造函數不用explicit 修飾。ci

(2)重載CPoint 的賦值函數,既重載=。 僞代碼:CPoint& operator=(const CRect& obj);it

  (3)  實現普通的函數轉換,函數爲CPoint的成員函數或者靜態函數,實現的方式多樣。僞代碼如:CPoint GetPointFromRect(const CRect& obj); 或者 void GetPointFromRect(CRect& obj )等。io

(4)很奇特的一種。operator除了重載符號外的另外一種用法,重載類別。 既operator CPoint(); 這種用法要在CRect類中實現對CPoint 的重載。function

注意一個小細節,在CPoint中重載構造函數其參數爲CRect的,而且在CRect 實現了operator CPoint 隱式轉換。在調用時優先選用CPoint的構造函數,其次再調用CRect的對CPoint的隱式轉換函數。

僞代碼:

CTestRect test(2,3, 20,50);

CTestPoint obj,obj3;

obj = (CTestPoint)test; // what function?

obj3 = test;

CTestPoint obj2 = test;

相關文章
相關標籤/搜索