兩種重載運算符

1.  操作符重載實現爲類成員函數

重載的操作符在類體中被聲明,聲明方式如同普通成員函數一樣,只不過他的名字包含關鍵字operator,以及緊跟其後的一個c++預定義的操作符。
可以用如下的方式來聲明一個預定義的==操作符:

class person{
private:
    int age;
public:
    person(int a){
        this->age=a;
    }
    bool operator == (const person &ps) const;
};
實現方式如下:

bool person::operator==(const person &ps) const
{
    if (this->age==ps.age)
       return true;
    return false;
}
調用方式如下:

#include
using namespace std;
int main()
{
    person p1(10);
    person p2(20);
    if(p1==p2) cout<<”the age is equal!”< return 0;
}
這裏,因爲operator ==是class person的一個成員函數,所以對象p1,p2都可以調用該函數,上面的if語句中,相當於p1調用函數==,把p2作爲該函數的一個參數傳遞給該函數,從而實現了兩個對象的比較。

2.操作符重載實現爲非類成員函數(全局函數)

對於全局重載操作符,代表左操作數的參數必須被顯式指定。例如:

class person
{
public:
    int age;
public:
};

bool operator==(person const &p1 ,person const & p2)
    //滿足要求,做操作數的類型被顯示指定
{
    if(p1.age==p2.age)
        return true;
    return false;
}
調用方式如下:

int main()
{
    person rose;
    person jack;
    rose.age=18;
    jack.age=23;
    if(rose==jack)
        cout<<"ok"< return 0;
}
3.如何決定把一個操作符重載爲類成員函數還是全局名字空間的成員呢?

①如果一個重載操作符是類成員,那麼只有當與他一起使用的左操作數是該類的對象時,該操作符纔會被調用。如果該操作符的左操作數必須是其他的類型,則操作符必須被重載爲全局名字空間的成員。
②C++要求賦值=,下標[],調用(), 和成員指向-> 操作符必須被定義爲類成員操作符。任何把這些操作符定義爲名字空間成員的定義都會被標記爲編譯時刻錯誤。
③如果有一個操作數是類類型如string類的情形那麼對於對稱操作符比如等於操作符最好定義爲全局名字空間成員。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章