運算符重載的另外一個解決方案:類型轉換 - huangzheguyun的專欄 - 博客頻道 - CSDN.NET http://blog.csdn.net/huangzheguyun/article/details/6466646程序員
類型轉換是任何一種語言都提供的機制。C++對內置類型的轉換是比較寬鬆的。只要是類型兼容的轉換都是容許的。向能夠將double賦給一個Int。由於他認爲兩者都是數值。God。在Java中,這是想都不敢想。固然你強制轉換除外。函數
類型轉換有兩種:自動轉換跟強制轉換。上面提到的內置類型的轉換就是自動轉換。.net
如今有一個Pound類,用以保存重量,固然他包含一個double類型的成員變量num,記錄有多少磅。好了,若是他有一個構造函數,形如:Pound(double num)。那麼編譯器就能夠進行隱式的類型轉換。即當有語句,Pound p= 12.5時,程序是能夠正常運行的,過程以下:首先,Pound(12.5 )被調用來建立一個臨時的Pound對象,而後經過逐成員賦值方式將這個對象拷貝給P。(這裏有一個隱式賦值運算符重載的知識點,之後會說)日誌
自動轉換很nice,可是有時候它會致使程序出現意外的類型轉換,若是關閉這種自動轉換的特性,可使用關鍵字ecplicit,即將其加在Pound(double num)的前面,如explicit Pound(double num)。這樣就關閉了自動轉換,可是仍然可使用強制轉換,即Pound(12.5)或(Pound)12.5。對象
還有一點值得注意的是,若是被轉換值是int,它將先被轉換爲double,而後再轉換爲Pound。也就是說,全部兼容的類型都能進行這種二步轉換。可是,若是類還定義了另一個構造函數Pound(long num),編譯器將報錯,由於int既能夠轉換成double,也能夠轉換爲long。存在二義性。blog
原本寫到這裏就能夠結束了,可是有好事分子說:double能夠轉換爲Pound,那Pound可否轉換爲double呢?答案是確定的,不過就要進行運算符的重載,什麼運算符?類型轉換運算符咯。ci
在Pound類中定義形如:operator double(),注意如下幾點:get
1.轉換函數必定是類方法編譯器
2.轉換函數不能指定返回類型,由於類名已經說明了。博客
3.轉換函數不能有參數。
不過必須說明一點的是:這種類型轉換運算符的重載,並非一種好想法。由於explicit關鍵字不能用於轉換函數,也就是說程序中可能會出現許多沒法預測的自動轉換。所以,最好是利用一種非轉換函數的類函數來代替它:如toDouble()。看看Java裏大量的toString就明白了,人家的確是用心良苦啊。
寫到最後,才進入了本篇日誌的主題:運算符重載的解決方案:
上篇提到,運算符重載可使用友元函數,即如下這種定義形式:(本例是Pound類的+操做)
Pound operator +(double d);
friend Pound operator +(double d,Pound p);
而第二種方法就是利用類型轉換,即:
定義一個友元函數便可:
friend operator +(Pound p1,Pound p2);
Pound::Pound(double d);
這樣,在+操做中,無論第一仍是第二操做數是一個double類型,他都將先被類型轉換成一個Pound,而後進行加操做。