C 運算子過載快速掌握

2021-09-23 15:27:31 字數 2893 閱讀 4911

運算子過載的方法是定義乙個過載運算子的函式,在需要執行被過載的運算子時,系統就自動呼叫該函式,以實現相應的運算。也就是說,運算子過載是通過定義函式實現的。運算子過載實質上是函式的過載。

函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。

簡單舉兩個例子說明:

box operator+(const box&);

宣告加法運算子用於把兩個 box 物件相加,返回最終的 box 物件。這明顯是個類成員函式的運算子過載,所以只需要顯示傳入乙個引數即可。(如果這裡不理解,可以學習下this指標)

box operator+(const box&, const box&);

而這個宣告,就是普通的非成員函式的運算子過載,所以需要傳入兩個引數。

(1)成員函式運算子過載**實現

#include "stdafx.h"

#include class box;

box operator+(box &);

int getboxheight() const

int getboxwidth() const

int getboxarea() const

private:

int m_nheight;

int m_nwidth;

int m_narea;

};box::box(int height, int width) : m_nheight(height), m_nwidth(width)

box box::operator+(box &other)

int main()

結果顯示:

b1's area is 50

b2's area is 50

b3's area is 225

請按任意鍵繼續. . .

(2)普通非成員函式運算子過載**實現

#include "stdafx.h"

#include class box;

int getboxheight() const

int getboxwidth() const

int getboxarea() const

private:

int m_nheight;

int m_nwidth;

int m_narea;

};box::box(int height, int width) : m_nheight(height), m_nwidth(width)

box operator+(box &b1, box &b2)

int main()

結果顯示:

b1's area is 50

b2's area is 50

b3's area is 225

請按任意鍵繼續. . .

(1)除了

類屬關係運算子 " . " 、成員指標運算子 "  .*  /  -> * " 、作用域運算子 " :: " 、sizeof運算子和三目運算子 " ?: "、預處理符號 " # "

。除此以外,c++

中的所有運算子都可以過載。

(2)只能使用成員函式過載的運算子有:=、()、、->、new、delete。

(3)過載運算子限制在c++

語言中已有的運算子範圍內的允許過載的運算子之中,不能建立新的運算子。

(4)運算子過載實質上是函式過載,因此編譯程式對運算子過載的選擇,遵循函式過載的選擇原則。

(5)運算子過載不能改變該運算子用於內部型別物件的含義。它只能和使用者自定義型別的物件一起使用,或者用於使用者自定義型別的物件和內部型別的物件混合使用時。

(6)運算子過載是針對新型別資料的實際需要對原有運算子進行的適當的改造,過載的功能應當與原有功能相類似,避免沒有目的地使用過載運算子。

(7)過載為類成員函式時引數個數=原運算元個數-1(後置++、--除外),而過載為友元函式時引數個數=原運算元個數,且至少應該有乙個自定義型別的形參。

(8)單目運算子最好過載為成員函式。

(9)對於復合的賦值運算子如+=、

-=、*=、

/=、&=、

!=、~=、

%=、>>=

、<<=

建議過載為成員函式。

(10)對於其它運算子,建議過載為友元函式。

前置++形式:classroom operator++();

後置++形式:classroom& operator++(int)

後置++呼叫時預設傳入乙個0。

**演示 

#include "stdafx.h"

#include class classroom

~classroom() {};

int getclassroompeoplenum() const

classroom operator++(int);

classroom& operator++();

private:

int m_npeoplenum;

};classroom classroom::operator++(int)

classroom& classroom::operator++()

int main()

結果顯示:

原始人數為 10

後置++後賦值結果為 10

後置++後原來人數為 11

前置++後賦值結果為 12

後置++後原來人數為 12

請按任意鍵繼續. . .

參考資料

C 快速入門13 運算子過載

在平時專案中,有時候需要自定義一些常規的運算子給某個功能用,那麼就必須重新定義這個符號的功能了。有些運算子可以作為成員函式,有些運算子只能作為外部函式 比如輸入輸出流函式只可作為外部函式 加法運算子既可以作為成員函式,也可以作為外部函式。示例1 問題引入 int main cout stu 這個語句...

C 運算子過載 過載特殊運算子

賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...

C 運算子過載賦值運算子

自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...