2017-08-15 73 views
-1

我想學習運算符在C++中重載。C++運算符重載是相等的運算符

我遵循教程並重載了'=='運算符,以便能夠比較它們之間的類的對象。就像這樣:

bool Vector2::operator==(const Vector2& v) const 
{ 
    return ((x_==v.GetX()) && (y_==v.GetY())); 
} 

我的班級中有(x_y_)兩大瓦爾。我從這個類中創建了兩個對象,給出了一些值並對它們進行了比較,它工作得很好。 但後來我用==運算符來比較整數,它也工作得很好。現在我期待==運算符不能處理整數,因爲我已經將它重載到其他位置。但仍然如此。所以我現在有點困惑。我有這個問題:

如何在運行之後像這樣重載的==仍然可以用來比較整數/浮點數/雙打/ etc?在我看來一個Vector2類對象作爲第二個參數的情況下,它的行爲就像在重載版本中,當它看到別的東西時,它的行爲是正常的?

另一個問題:我有一個class classA和一個class classB都與他們2變量,只有名稱不同。我爲classA objA創建了兩個對象,一個用於classB objB,我給出了一些默認構造函數的值。

現在是否有可能超載operator ==做比較if(objA==objB)?或者表達式中的操作數需要是相同的類型? classAclassB

請幫我解決這個問題。感謝您的閱讀!

+0

什麼類型是'x_'和'y_'? – Malice

+0

你應該添加更多的源信息。 –

+2

您爲'Vector2'定義'==',而不是'int'。重載是_by定義_different_ types/arguments的實現。其他實現不受影響。但是,如果你想爲'int'重新定義***'==',這將是一個不同的故事。 –

回答

1

如果您Vector2類有一個構造函數的int和未標記explicit,它允許整數隱式轉換爲Vector2如本例所示:

#include <iostream> 
#include <assert.h> 

struct S 
{ 
    S(int x) : x(x) {} 

    bool operator==(const S& other) const 
    { 
     return x == other.x; 
    } 
    int x; 
}; 

int main() { 
    S s1{5}; 
    S s2{5}; 

    assert(s1 == s2); 

    assert(!(s1 == 5)); 

    return 0; 
} 

Ideone

這代碼編譯,但第二個斷言失敗,因爲5被轉換爲S