首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 技巧:當所有參數都需型別轉換時,優先使用非成員函數

     編輯:關於C++

問題情境

設計一個有理數類別 Rational,需支援與 double 的乘法運算:

  • Rational = Rational * double
  • Rational = double * Rational

若乘法實作為成員函數,左運算元必須是 Rational 物件。當出現 double * Rational 時,編譯器找不到合適的成員函數,導致編譯失敗。

解決方案:非成員函數 + 隱式轉換

將 operator* 實作為非成員函數(可宣告為 friend),並利用 Rational 的建構函數隱式轉換 double:

class Rational {
public:
    Rational(double numerator = 0, double denominator = 1)
        : m_n(numerator), m_d(denominator) {}
    double numerator() const { return m_n; }
    double denominator() const { return m_d; }
    double value() const { return m_n / m_d; }
private:
    double m_n, m_d;
};

// 非成員函數,支援雙向運算
const Rational operator*(const Rational& lhs, const Rational& rhs) {
    return Rational(lhs.numerator() * rhs.numerator(),
                      lhs.denominator() * rhs.denominator());
}

執行流程

  1. oneFourth * 3.5 → 3.5 隱式轉換為 Rational(3.5) → 呼叫 operator*(Rational, Rational)。
  2. 3.5 * oneFourth → 3.5 隱式轉換為 Rational(3.5) → 呼叫同一個 operator*。

完整範例程式碼

#include <iostream>

class Rational {
public:
    Rational(double numerator = 0, double denominator = 1)
        : m_n(numerator), m_d(denominator) {}
    double numerator() const { return m_n; }
    double denominator() const { return m_d; }
    double value() const { return m_n / m_d; }
private:
    double m_n, m_d;
};

const Rational operator*(const Rational& lhs, const Rational& rhs) {
    return Rational(lhs.numerator() * rhs.numerator(),
                      lhs.denominator() * rhs.denominator());
}

int main() {
    Rational oneFourth(1, 4);
    Rational result;
    result = oneFourth * 3.5;
    result = 3.5 * oneFourth;
    std::cout << "result = " << result.value() << std::endl; // 0.875
    return 0;
}

核心原則

「如果所有參數都需要型別轉換,該函數應為非成員函數。」

這樣才能支援左運算元為內建型別(如 double、int)的情況,確保介面對稱、直觀且易用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved