天天看點

重載關系運算符

在C++中,運算符是可以重載的,本次講解的是如何重載關系運算符,具體想實作的效果為比較同一個類的不同對象是否相等

想要比較類就要先建立類

class Person
{
public:
    Person(string name,int age) : m_Name(name) , m_Age(age)
    {
    }
    string m_Name;
    int m_Age;
};
           

建立一個名為Person的類,在聲明為公共的區域中,建立兩個值,一個是string類型的名稱,另一個是int類型的年齡,在命名之前加上m_是為了防止重名與便于區分

然後開始重載,如果直接自己寫一個類似的方法用于實作關系判斷的效果,那麼方法應該為,注:此為類的成員方法

bool operator(Person& p) {
    if (p.m_Name == this->m_Name && p.m_Age == this->m_Age)
    {
        return true;
    }
    return false;
}
           

即建立一個傳回值類型為bool類型的方法,它的名字是operator,然後它有一個參數,被比較的類的引用,然後分别判斷調用該方法的類的成員屬性與被比較的類的成員屬性是否相等,是就傳回true,否則傳回false即可

調用的寫法就是

Person p1("song",18), p2("song", 18);
p1.operator(p2)
           

這已經離預想的效果 p1 = p2較為接近了,C++中,可以通過重載關系運算符來實作這個效果

bool operator==(Person& p) {
    if (p.m_Name == this->m_Name && p.m_Age == this->m_Age)
    {
        return true;
    }
    return false;
}
           

重載的寫法是 傳回值 operator重載的運算符(參數){};

調用的寫法

p1.operator==(p2);//正常寫法
p1 == p2; //簡化寫法
           

這樣就實作了比較兩個類是否相等

上文是成員函數的寫法,局限在某個類中,下面寫一下全局函數的寫法

bool operator==(Person&p1, Person&p2) {
    if (p1.m_Name == p2.m_Name && p1.m_Age == p2.m_Age)
    {
        return 1;
    }
    return 0;
}
           

調用的寫法與前文相同,都可以實作 p1 == p2的判斷

注意事項: 運算符重載方法的參數不能全部由基本資料類型構成,為了防止基本資料類型之間的計算被重載而導緻的未知錯誤,但可以有部分基本資料類型與部分對象構成

運算符重載方法允許被再次重載,但必須符合方法重載的規定

繼續閱讀