——有時轉換函式更搭配友元函式、有時多余的轉換函式會干擾友元函式的運行
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加法,
- 因此過多的轉換函式將導致二義性錯誤
轉換函式配合友元函式的實作與單獨的匹配函式實作如何選擇:
-
友元函式引數含物件形參或其參考,并實作了轉換函式:
(依賴于隱式轉換)當給形參傳入非物件值時,將呼叫建構式,生成臨時物件,并賦值給形參
- 缺點:每次需要轉換時,都要呼叫轉換建構式,這增加時間和記憶體開銷,
- 優點:方便,不易出錯,程式員的編程作業少
-
單獨完成一個含有傳入值型別形參的函式
即增加一個顯示地匹配型別的函式
- 缺點:它使程式較長,程式員需要完成的作業更多
- 優點:運行速度快
-
總結:
如果程式經常需要使用該可轉型別別的引數的函式操作(將與其它物件聯系),則多載匹配的方法更合適;如果程式只是偶爾使用這種方法,則依賴于自動轉換更簡單,但為了保險,可以使用顯示轉換
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/13750.html
標籤:C++
