C++ 轉換函數搭配友元函數

——有時轉換函數更搭配友元函數、有時多餘的轉換函數會干擾友元函數的運行程序員

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;

  上面任何一種符號重載格式都容許這樣作spa

提供了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+()blog

另外,若是定義了operator double()成員函數,將形成混亂內存

  • 該函數將提供另外一種解釋:編譯器不是將pennyD轉換爲Stonewt並執行Stonewt加法,而是將jennySt轉換爲double並執行double加法。
  • 所以過多的轉換函數將致使二義性錯誤

 轉換函數配合友元函數的實現與單獨的匹配函數實現如何選擇:

  • 友元函數參數含對象形參或其引用,並實現了轉換函數:

(依賴於隱式轉換)當給形參傳入非對象值時,將調用構造函數,生成臨時對象,並賦值給形參編譯器

  • 缺點:每次須要轉換時,都要調用轉換構造函數,這增長時間和內存開銷。
  • 優勢:方便,不易出錯,程序員的編程工做少
  • 單獨完成一個含有傳入值類型形參的函數

即增長一個顯示地匹配類型的函數io

  • 缺點:它使程序較長,程序員須要完成的工做更多
  • 優勢:運行速度快
  • 總結:

若是程序常常須要使用該可轉類類型的參數的函數操做(將與其它對象聯繫),則重載匹配的方法更合適;若是程序只是偶爾使用這種方法,則依賴於自動轉換更簡單,但爲了保險,能夠使用顯示轉換編譯

相關文章
相關標籤/搜索