.
1、操作符重載&隱式類型轉換
- C++中,操作符重載可以通過成員函數或非成員函數來實現。當操作符重載是成員函數時,左操作數必須是該類的對象。如果左操作數不是該類的對象,而是需要進行隱式轉換的類型,編譯器將無法找到匹配的成員函數,從而導致編譯錯誤。
- 為了避免這個問題,可以將操作符重載定義為非成員函數。非成員函數允許左操作數和右操作數都進行隱式類型轉換,從而解決編譯錯誤的問題。
2、代碼示例
- 創建一個Rational類,希望支持Rational對象與整數之間的加法操作。如果將加法操作符重載成成員函數,那么當整數作為左操作數時,編譯器無法找到匹配的成員函數,導致編譯失敗
- 下面代碼中2不是Rational對象,無法調用Rational的成員函數operator+,因為編譯器不會對左操作數進行隱式類型轉換,成員函數的調用依賴于類的實例。
class Rational {
public:Rational(int numerator = 0, int denominator = 1) : numerator_(numerator), denominator_(denominator) {}// 成員函數重載加法操作符Rational operator+(const Rational& other) const {return Rational(numerator_ * other.denominator_ + other.numerator_ * denominator_,denominator_ * other.denominator_);}private:int numerator_;int denominator_;
};int main() {Rational r1(1, 2);Rational r2 = r1 + 2; // 正確:2 可以隱式轉換為 Rational 對象Rational r3 = 2 + r1; // 錯誤:2 不能作為左操作數調用成員函數 operator+
}
3、非成員函數重載
- 非成員函數,允許左操作數和右操作數都進行隱式類型轉換
class Rational {
public:Rational(int numerator = 0, int denominator = 1) : numerator_(numerator), denominator_(denominator) {}int numerator() const { return numerator_; }int denominator() const { return denominator_; }private:int numerator_;int denominator_;
};// 非成員函數重載加法操作符
Rational operator+(const Rational& lhs, const Rational& rhs) {return Rational(lhs.numerator() * rhs.denominator() + rhs.numerator() * lhs.denominator(),lhs.denominator() * rhs.denominator());
}int main() {Rational r1(1, 2);Rational r2 = r1 + 2; // 正確:2 可以隱式轉換為 Rational 對象Rational r3 = 2 + r1; // 正確:2 可以隱式轉換為 Rational 對象
}
思維導圖筆記:
