關於過載運算子的思考

2021-07-05 10:35:49 字數 1477 閱讀 8839

在c++中過載運算子,能使運算子的功能得到擴充套件,如能夠支援對類或結構體的操作.

其實過載運算子也是一種特殊的函式呼叫方式,過載的方式有兩種,一種是作為成員函式,一種是作為友元函式。其中[ ]只能作為成員函式進行過載,類屬關係運算子「.」 、成員指標運算子「.*」 、作用域運算子「::」 、sizeof運算子和三目運算子「?:」是不能夠過載的。當作為成員函式的時候,過載函式的引數個數比原來運算元個數要少乙個,比如:『+』運算子,原來是兩個物件的加和,當作為成員函式的時候,引數只需要乙個物件即可,因為成員函式可以直接呼叫當前物件的變數,所以只需要傳遞加和物件的引數即可。而當友元函式的時候,因為友元函式不能夠呼叫當前物件的成員變數,所以傳遞的引數應該和原有的運算物件個數相同。

在什麼情況下需要過載運算子呢?比如我們在使用map結構時,我們想讓map結構中能夠儲存我們定義的結構體或者是類物件,那麼我們就需要過載運算子『>』或者'<',map預設是用less作為比較器,所以它要求作為key的類要過載「<」操作符,沒有過載「<」操作符,而是過載了「>」操作符就會報錯。反之,也可以顯式地用greater作為比較器,此時就必要過載key類中的「>」操作符了。還有在vector結構中,如果我們想使用algorithm中的sort排序演算法,則需要我們定義乙個排序規則,也需要我們過載『<』運算子,此處應該注意,當vector中放的是物件指標,不是物件的時候,一定要確保最後排序是按照真實的值進行排序而不是按照指標的大小進行排序的,例如:

class a

a(int a)

int a;

};vectorvec;

vec.push_back(new a(10));

vec.push_back(new a(5));

vec.push_back(new a(4));

sort(vec.begin(), vec.end);

然而排序的結果卻不對

原來當我排序vector的時候,它比較的是指標,而不是物件,並且operator《過載符的引數應該用引用,而不是指標

解決辦法:

1:宣告乙個全域性的比較函式

例:bool compless(const a* lhs, const a* rhs)

sort(vec.begin(), vec.end, compless);

2: 宣告乙個函式物件

class compless2

};sort(vec.begin(), vec.end, compless2); 

最後說一下關於[ ]的過載情況,首先它有些不同,就是它只能以成員函式的形式給出,而且它的呼叫也很特殊,比如

class base

return next[n];

}當我在主函式中:base obj[5];obj[5].out();這樣是不會呼叫的過載函式的,而:base obj(5);obj[6].out();這樣則會呼叫到過載函式,也就是是乙個成員函式,第二種方法剛好是乙個物件,然後呼叫其中的成員函式輸出成員變數. 過載運算子還有好多的功能,如過載「=」實現類物件的深度賦值運算,賦予原來運算子所不具有的性質.

關於過載運算子

關於c 中的過載運算子 學習部落格1 學習部落格2 記得好久之前學 dijkstra 的堆優化的時候 gxb 神仙給我講過,當時就是不明白感覺 gxb 都要崩潰了的亞子,好歹算是知道了,但是隨著時間的流逝,他竟然趁我不注意從我腦子裡跑了!gxb 正拿著刀在趕來的路上 我們可以重定義或過載 c 內的大...

過載運算子

題目描述 定義乙個矩形類,資料成員包括左下角和右上角座標,定義的成員函式包括必要的建構函式 輸入座標的函式,實現矩形加法,以及計算並輸出矩形面積的函式。要求使用提示中給出的測試函式並不得改動。兩個矩形相加的規則是 決定矩形的對應座標分別相加,如 左下角 1,2 右上角 3,4 的矩形,與 左下角 2...

過載運算子

include include using namespace std class test test const int a v a test const test t1 v t1.v 以下過載小於號 比較兩個物件的大小 bool operator const test t1 const 比較物件...