運算子過載的主要目的是為了讓使用者自定義型別物件可以像普通資料型別一樣能夠進行加減乘除,自加自減等操作,非常直觀方便。
在這裡總結一下c++的++(分前置與後置)運算子的過載。自減運算子同理。關鍵就是如何通知編譯器,讓它知道哪個是前置版本,哪個是後置版本。
如何讓編譯器知道是前置還是後置呢?其實很簡單,只要在過載操作符的形參中加上乙個整數型引數,編譯器就會自動將這個函式標示為後置,相應的不加則是前置。
(1)前置++運算子的過載方式:
成員函式的過載: 函式型別& operator++()
友元函式的過載:friend 函式型別& operator++(類型別& )
(2)後置++運算子的過載方式:
成員函式的過載:函式型別 operator++(int)
友元函式的過載:friend 函式型別 operator++(類型別&, int)
需要注意的一點是,後置++返回的是右值,所以返回型別不要再加&引用了。友元函式的過載和普通函式的過載是一樣的。
下面我們來舉幾個例子。
1.列舉型別的前置++ 後置++
typedef enum direction;
//prefix ++
direction& operator++(direction& dir)
//postfix ++
direction operator++(direction& dir,int flag)
再來看最後乙個例子,這個是與類有關的。注意,成員函式與友元函式的過載如果同時存在時,會先呼叫成員函式的過載,但是在++或--時,成員函式與友元函式的過載是不能同時存在的。下面這樣寫,在呼叫的地方會出現二義性錯誤的。這樣寫只不過是為了看著方便。
#ifndef integer_head_file
#define integer_head_file
class integer;
#endif //integer_head_file
#include "integer.h"
integer::integer(int n):n_(n){}
integer::~integer(){}
void integer::display() const
//最好優先使用成員函式過載,
//成員函式prefix ++
integer& integer::operator++()
//成員函式postfix ++
integer& integer::operator++(int)
//友元prefix ++
integer& operator++(integer& i)
//友元postfix ++
integer& operator++(integer& i, int)
done!
過載運算子 前置 和後置
1 為區別前置和後置運算子,需要在後置運算子函式中加引數 int 雖然這個型別在此除了以示區別之外並不代表任何實際含義 2 前置返回的是變數的引用,後置返回的是常量。所以 c合法,而c 不合法,這一點可以在vc 6.0和dev c 中採用基本資料型別的 操作來驗證 3 為什麼不讓c 也合法呢?如果要...
Swift 運算子過載和運算子函式
讓已有的運算子對自定義的類和結構進行運算或者重新定義已有運算子的運算規則,這種機制被稱為運算子過載。1,通過過載加號運算子,使自定義的兩個座標結構體物件實現相加 12 3456 78910 11structcenterpointer func left centerpointer,right cen...
運算子過載之過載型別運算子
普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...