——有時轉換函數更搭配友元函數、有時多餘的轉換函數會幹擾友元函數的運行 Stonewt operator + (const Stonewt &st1, cosnt Stonewt &st2) { double pds = st1.pounds + st2.pounds; Stonewt sum(pd ...
——有時轉換函數更搭配友元函數、有時多餘的轉換函數會幹擾友元函數的運行
Stonewt operator + (const Stonewt &st1, cosnt Stonewt &st2) { double pds = st1.pounds + st2.pounds; Stonewt sum(pds); return sum; }
(友元函數)
Stonewt Stonewt::operator + (cosnt Stonewt &st) const { double pds = pounds + st.pounds; Stonewt sum(pds); return sum; }
(成員函數)
Stonewt jennySt(9, 12); // a Stonewt object Stonewt bennySt(12, 8); // a Stonewt object STonewt total; total = jennySt + bennySt;
上面任何一種符號重載格式都允許這樣做
提供了Stonewt(double)構造函數的情形:
Stonewt jennySt(9, 12); // a Stonewt object double kennyD = 176.0; // a double Stonewt total; total = jennySt + kennyD;
上面任何一種符號重載格式都允許這樣做,kennyD被轉換為Stonewt對象
Stonewt jennySt(9, 12); // a Stonewt object double pennyD = 176.0; // a dobule Stonewt total; total = pennyD + jennySt; // friend function
只有友元函數才允許,因為double不能調用成員函數operator+()
另外,如果定義了operator double()成員函數,將造成混亂:
- 該函數將提供另一種解釋:編譯器不是將pennyD轉換為Stonewt並執行Stonewt加法,而是將jennySt轉換為double並執行double加法。
- 因此過多的轉換函數將導致二義性錯誤
轉換函數配合友元函數的實現與單獨的匹配函數實現如何選擇:
-
友元函數參數含對象形參或其引用,並實現了轉換函數:
(依賴於隱式轉換)當給形參傳入非對象值時,將調用構造函數,生成臨時對象,並賦值給形參
- 缺點:每次需要轉換時,都要調用轉換構造函數,這增加時間和記憶體開銷。
- 優點:方便,不易出錯,程式員的編程工作少
-
單獨完成一個含有傳入值類型形參的函數
即增加一個顯示地匹配類型的函數
- 缺點:它使程式較長,程式員需要完成的工作更多
- 優點:運行速度快
-
總結:
如果程式經常需要使用該可轉類類型的參數的函數操作(將與其它對象聯繫),則重載匹配的方法更合適;如果程式只是偶爾使用這種方法,則依賴於自動轉換更簡單,但為了保險,可以使用顯示轉換