c 中運算子過載方式中你易遺漏的小細節

2021-10-17 15:28:52 字數 2089 閱讀 3246

運算子過載函式相當於類來說有兩種存在方式:

1.過載為類的成員函式。

2.過載為類的友元函式。

如果把運算子過載為類的成員函式,則該函式麼須通過物件呼叫,該物件就是運算子的其中乙個運算元,在運算子過載函式中通過this指標隱含(或顯式)地訪問物件的成員。

如果把雙目運算子過載為類的成員函式,則該運算子有兩個運算元,左運算元是呼叫運復符過載函式的物件,而右運算元作為運算子過載函式的實參傳遞到運算子過載函式中雙目運算子過載為類的成員函式時,其呼叫的一般格式如下:

**左運算元 運算子 右運算元;**

編譯器把它解釋為

**左運算元.operator 運算子(右運算元);**

即左運算元是呼叫運算子過載函式的物件,右運算元作為函式的引數。

例如,表示式「sl>=s2」相當於「s1. operator>=(s2)」

如果把單目運算子過載為類的成員函式,則該運算子只有乙個運算元,即呼叫運算子過載函式的物件本身。單目運算子過載為類的成員函式時,要區分前置運算子與後置運算子

如果是前置運算子,則運算子過載函式沒有引數。其呼叫格式如下:

**運算子 運算元;**

編輯器把它解釋為

**運算元.operator 運算子();**

注意:如果是後置運算子,運算子過載函式需要乙個整型引數,*但該引數不起任何作用,僅用來標識該運算子是後置運算子。*其呼叫格式如下:

運算元 運算子;

編譯器把它解釋為

運算元 operator 運算子 (int)

下面通過乙個示例,演示過載自增運算子的方法,實現自定義time類物件 t的自增運算運算規則則是把當前物件t的秒數加一。

#includeusing namespace std;

class time

time operator++ ();

time operator++ (int);

void show();

private:

int hour;

int minute;

int second;

}; time time::operator++()//實現前置自增

if (minute == 60)

hour %= 24;

return *this;

time time::operator++(int)//實現後置自增

void time::show()

int main()

}

本例實現前置自增及後置自增運算,前置自增函式不帶引數,後置自增函式帶乙個int型別的引數,這裡的int僅用於區別前置自增,在函式呼叫時不帶引數。本程式值得讀者借鑑的地方是在實現後置自增時直接呼叫了已經實現的前置

自增運算子。從結果來看,後置自增運算表式保留了物件自增之前的值,並且物件實現了自增;前置自增運算實現了物件的自增,並且表示式的值是物件自增之後的值。這與算術運算中自增運算子的功能是吻合的。

運算子過載函式可以實現為類的成員函式,也可以實現為類的友元函式。運算子的左運算元如果不是當前類的物件,那麼該運算子就不能宣告為類的成員函式只能宣告為類的友元函式。在類中對運算子過載函式進行友元函式的宣告格式如下:

friend 型別說明符 operator 運算子 (引數列表);

類的友元函式不能通過物件進行呼叫,所以運算子的運算元全部作為運算子過載函式

的實參傳遞到運算子過載函式中。雙目運算子過載函式過載為類的友元函式時的呼叫格式

如下:做運算元 運算子 右運算元;

編譯器把它解釋為

operator 運算子 (左運算元,右運算元);

C 中運算子過載

運算子過載使得使用者自定義的資料以一種更簡潔的方式工作。比如int x,y 可以為y x y 而 my c1,c2 如果想使得兩個自定義的物件相加,以前只能調 用函式計算它們的和。而現在只要定義了運算子過載就能實現c1 c1 c2.所謂過載,就是重新賦予新的含義。函式過載就是對乙個已有的函式賦予新的...

C 中運算子過載

運算子過載可以寫在類的內部,也可以寫成全域性函式形式,其中運算子 在過載時必須宣告為類的成員函式 而運算子 sizeof 不能被過載 演算法運算子的過載不會改變運算子原有的優先順序。例子 include include include using namespace std class comple...

c 中的運算子過載

c 中的符號過載 符號的過載也是過載符合過載函式的解析規則,為了讓運算子運算元更加人性化。例如我們抽象乙個類的時候,我們有乙個 person類 classperson 若我們想使用 來比較 persona 和 personb,但是標準的 只能用來比較 c 的內建型別,而 person並不是 c 的內...