在c++中,函式過載有兩種方式:
bool operator ==(const node &node)
bool operator<(const node &a, const node &b)
除了手動過載這些函式,還可以使用模板函式進行快速過載,就像c#中的擴充套件方法和go裡面的struct一樣給class插上「翅膀」。方法是:使用utility中的rel_ops命名空間。
這個命名空間實現了以下模板函式:
namespace rel_ops
如上所示,rel_ops命名空間實現了四種運算子,我們只需要自己實現==
和<
兩個運算子就能夠實現以上四種運算子了。
請看乙個完整的例子。
#include#includeusing namespace std;
class node
bool operator ==(const node &node)
};bool operator<(const node &a, const node &b)
int main()
還有乙個關鍵之處:左移運算子和移位運算子都是<<
,但是因為它們接受的引數不一樣,所以可以同時過載。
#include using namespace::std;
class myclass
void print_myclass()
//輸出運算子和左移運算子雖然樣子一樣,但是引數不一樣,所以相當於運算子過載
friend ostream & operator<<(ostream &os, myclass &c);
myclass operator<<(int cnt)
private:
int a;
int b;
};//使用友元訪問私有變數
ostream & operator<<(ostream &os, myclass &c)
void main()
雖然移位運算子正常情況下接受的引數是int,表示移位的個數,但實際上這個引數可以是任何型別,移位運算子完全由使用者掌控,但是有兩點需要注意:
myclass operator<<(double cnt)
c++中可以過載的運算子包括
+ - * / % ^ & | ~
! = < > += -= *= /= %
^= &= |= << >> >>= <<= == !=
<= >= && || ++ -- ->* 『 ->
() new delete new delete
不能過載的操作符是類屬關係運算子 如:
. :: .* ?: sizeof
C 中運算子過載
運算子過載使得使用者自定義的資料以一種更簡潔的方式工作。比如int x,y 可以為y x y 而 my c1,c2 如果想使得兩個自定義的物件相加,以前只能調 用函式計算它們的和。而現在只要定義了運算子過載就能實現c1 c1 c2.所謂過載,就是重新賦予新的含義。函式過載就是對乙個已有的函式賦予新的...
C 中運算子過載
運算子過載可以寫在類的內部,也可以寫成全域性函式形式,其中運算子 在過載時必須宣告為類的成員函式 而運算子 sizeof 不能被過載 演算法運算子的過載不會改變運算子原有的優先順序。例子 include include include using namespace std class comple...
C 中的運算子過載(一) 運算子過載的概念
概述 運算子過載,就是對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別。運算子過載 operator overloading 只是一種 語法上的方便 也就是它只是另一種函式呼叫的方式,只是為了方便我們使用,運算子只能運算內建的資料型別,對於自定義的資料型別不能運算,所以我們可以過載...