[英]Overloading different types in C++
假設我們有以下類:
class Rational { // Represents rational number. n=1/2=d for example.
public:
int n = 0;
int d = 1;
};
Rational x = Rational();
x.n = 1;
x.d = 2;
是否可以進行重載以使3 * x
給出3/2
而不是錯誤?
我的老師說重載只發生在相同類型的對象之間,但是為什么我們可以在ostream
類型的cout
和Rational
類型的對象而不是int
和Rational
類型的對象之間進行重載?
你可以寫例如
Rational operator *( const Rational &r, int x )
{
return { r.n * x, r.d };
}
Rational operator *( int x, const Rational &r )
{
return { r.n * x, r.d };
}
您可以重載用戶定義類型的運算符。 對於二元運算符,至少一個操作數必須是用戶定義的類型。
來自 C++ 20 標准(12.4.2.3 表達式中的運算符)
2如果任一操作數的類型是類或枚舉,則可以聲明實現此運算符的用戶定義的運算符函數,或者可能需要用戶定義的轉換將操作數轉換為適合構建的類型-in 運算符。 在這種情況下,重載決策用於確定要調用哪個運算符函數或內置運算符來實現運算符。 因此,運算符符號首先轉換為表 15 中總結的等效函數調用符號(其中 @ 表示指定子條款中涵蓋的運算符之一)。 但是,操作數按照為內置運算符 (7.6) 規定的順序進行排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.