C 過載運算子詳解

2021-08-20 10:43:52 字數 2436 閱讀 7833

c++允許我們為我們的類重定義或過載大部分c++內建的運算子。這樣我們的類就可以通過這些運算子進行一些操作。比如加減乘除,賦值比較等。

過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。

與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。

比如我們要給複數類complex過載加法運算子:

complex operator+(complex& a) //成員函式
這是個定義為成員函式的例子,如果我們要定義為非成員函式,則應有兩個引數。

complex operator+(complex& a,complex& b)   //非成員函式
其中引數為進行該運算時的變數型別,函式返回值是運算的結果。比如例子中的複數相加後那麼返回的當然也應該是乙個複數。

下面是演示**:

成員函式實現:

#includeusing namespace std;

class complex

complex operator+(complex& a) //成員函式過載+運算子

void show()

friend complex operator+(complex& a,complex& b) //非成員函式的過載+運算子

void show()

輸出結果相同

可以看到過載運算子其實沒多高階,就是呼叫了個函式,和一般的函式沒太大區別。

接下來過載一下《運算子讓這個類可以用cout直接輸出。

如果我們定義成成員函式,那麼最後呼叫的就是上面那個樣子,就是cmp1.operator<<(引數)了

如果我們要用cout輸出,應該是cout.operator<<(cmp)

這樣看來我們是要定義成ostream類的成員函式了,但這顯然是不行的,我們不能改ostream的原始碼,而且也不符合 物件導向 的要求。

所以我們使用第二種,定義為友元函式

首先當然是要定義成complex類的友元函式,但是ostream類的物件也是這個運算子的引數,

需不需要定義成ostream類的友元函式呢?

定義為comlex的友元函式是因為輸出時,

輸出的是complex類的私有成員

需要友元函式才能訪問,

但是不需要訪問ostream類的私有成員,所以ostream只需要作為引數傳入即可

下面是完整的**實現:

#includeusing namespace std;

class complex

complex operator+(complex& a) //過載加法,返回complex類的物件

friend ostream& operator<<(ostream& os,complex& a) //過載《運算子

{os《其中過載的《運算子的返回值型別是ostream& 是因為我們用cout輸出時,經常會有

cout《變數1《變數2<<.........《就像26行那樣

而且使用《運算子的也可能是ostream的派生類的物件,所以我們要返回引用,使得前後一致。

一些注意事項

最後附上可過載/不可過載的運算子表

下面是可過載的運算子列表:

雙目算術運算子

+ (加),-(減),*(乘),/(除),% (取模)

關係運算子

==(等於),!= (不等於),< (小於),> (大於》,<=(小於等於),>=(大於等於)

邏輯運算子

||(邏輯或),&&(邏輯與),!(邏輯非)

單目運算子

+ (正),-(負),*(指標),&(取位址)

自增自減運算子

++(自增),--(自減)

位運算子

| (按位或),& (按位與),~(按位取反),^(按位異或),,<< (左移),>>(右移)

賦值運算子

=, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=

空間申請與釋放

new, delete, new[ ] , delete

其他運算子

()(函式呼叫),->(成員訪問),,(逗號),(下標)

下面是不可過載的運算子列表:

C 過載運算子詳解

結構體,是一種可以自己編寫資料型別 如int,double等 的一種資料集合,宣告關鍵字struct,框架 宣告於main之外 struct 名稱 分號一定不要忘了例如 struct student 這樣你就成功定義了乙個 student 型別的資料集合,這意味著你可以這樣用 student bob...

置頂 C 過載運算子詳解

有些東西或許大家已經知道,請使用目錄 結構體,是一種可以自己編寫資料型別 如int,double等 的一種資料集合,宣告關鍵字struct,框架 宣告於main之外 struct 名稱 分號一定不要忘了例如 struct student 這樣你就成功定義了乙個 student 型別的資料集合,這意味...

C 過載運算子

運算子過載是一種形式的c 多型。在c 中,編譯器有能力把乙個由資料 物件和操作符共同組成的表示式,解釋為對乙個全域性或成員函式的呼叫。該全域性或成員函式被稱為操作符函式,通過重定義操作符函式,可以實現針對自定義型別 結構,類 的運算法則,並使之與內建型別一樣參與各種表示式。過載運算子可使 看起來更加...