C 操作符過載

2021-10-21 02:29:54 字數 4564 閱讀 1359

注意:操作符過載可以當做==「自定義類的運算」==

1 為什麼需要操作符過載?

對於基礎的變數,int等,不需要過載就知道如何做,但是對於自定義類,就無法進行運算,比如複數類。

2 操作符過載總結

1)操作符過載本質上是乙個函式,可以採用友元函式或者成員函式實現。但是採用這兩種函式傳遞引數、實現**、應用場合均不同。

全域性函式與成員函式的比較:

傳遞引數:全域性函式中不傳遞this指標,成員函式預設傳遞this指標,因此成員函式可以少乙個引數;

屬性訪問:成員函式可以訪問私有變數,全域性函式需要轉化為友元函式才可以。

應用場合:正常寫法採用成員函式。必須採用全域性函式過載的運算子有《和》,必須採用成員函式過載的運算子有=、()、[ ]、->四個。

2)操作符過載的格式:

#全域性函式

int operator+

(const a& a1,

const a& a2)

#成員函式

int operator+

(const a& obj)

函式名為operator與運算子的組合(可變);

輸入為物件(可變,友元函式或成員函式實現);

返回值可以為元素、物件或者引用(可變)。

3)可以過載的運算子

3 例項:實現complex類的±運算子過載

注意:1)使用友元函式過載需要注意的是,二元運算則傳遞兩個引數,同時新增friend關鍵字,使用成員函式只需要乙個引數。

#include

using namespace std;

class complex

friend complex operator+

(const complex& x1,

const complex& x2)

;void

printc()

complex operator-

(const complex& obj)

private:

int a;

int b;};

//友元函式過載

complex operator+

(const complex& x1,

const complex& x2)

void

main()

4 例項:基於3實現complex類的前置–以及後置++注意:

1)後置++需要在引數列表中增加佔位符int,complex operator++(complex& obj, int)。

2)後置++先使用後++,如a++,在具體實現時就要先使用臨時變數tmp暫存輸入,而後++,最後返回臨時變數。

3)使用成員函式實現比友元函式實現少乙個引數,這個引數通過this指標傳遞。

4)傳遞的變數最好在引用&前使用const,保持變數的記憶體空間不能改變。

#include 

using namespace std;

class

complex

void printc(

) complex operator-

(const complex& obj)//-

//成員函式實現前置-

- complex& operator--(

)private:

int a;

int b;};

complex operator+

(const complex& x1, const complex& x2)

//友元函式實現後置+

+,後置需要增加佔位符

complex operator+

+(complex& obj,

int)

void main(

)

5 例項:實現complex左移《和》右移操作符過載 (二元運算子兩個引數不同的情況)注意:

1)類似《操作符過載,其為二元運算子,兩個運算元型別不同,分別為ostream和complex(比如)。

2)實現兩個運算元型別不同的運算子過載要使用友元函式。

3)要實現鏈式程式設計,返回引用。cout

using namespace std;

class

complex

void printc(

) complex operator-

(int i)

//成員函式過載-

private:

int a;

int b;};

complex operator+

(const complex& x1,

int i)

//友元函式過載+ (1)

complex operator+

(int i, const complex& x1)

//友元函式過載+ (2)

//友元函式實現過載

ostream& operator<<

(ostream& out, const complex& obj)

//此處將ostream型別的out變數本身返回,以便後續的連續操作

#原來自己是這麼實現的,但是不支援cin>>x1>>x2的鏈式程式設計的情況

6 過載=等號操作符

有指標的類定義的物件,在等號=賦值時,採用c++的賦值,進行的是淺拷貝,導致兩個物件的指標指向同乙個記憶體空間,釋放的時候出現問題。

//過載等號操作符,實現連等,返回乙個引用

this

->m_len = obj.m_len;

this

->m_p =

newchar

[this

->m_len +1]

;strcpy

(this

->m_p, obj.m_p)

;return

*this;}

protected

:private

:char

* m_p;

int m_len;};

void

main()

注意:

字串傳遞使用雙引號;

定義字串變數或者形參,都要使用const關鍵字修飾;

在進行賦值時,要先釋放舊的指標指向的空間,再賦值。

7 陣列類案例8 字串類案例9 過載()操作符過載()操作符,在定義物件後,可以使用f(),類似於f.operator()操作。這種過載和python中的__call_ _()函式很像,可以給物件傳引數,輸出結果。

#include

using

namespace std;

classf}

;void

main()

10 不要過載&&以及||

作用於基礎型別的&&和||有短路規則,但是經過過載後,就沒有短路規則了,原因是過載是一種函式。

class

test

test&

operator+(

const test& obj)

bool

operator&&(

const test& obj)

intgetdata()

private

:int i;};

void

main()

此處過載&&,但是仍然先計算+加號過載的操作符,後計算&&過載,而不是先判斷t1。

C 操作符過載

1.作為成員過載 class myclass public myclass operator const myclass d cons friend myclass operator const myclass a1,const myclass a2 關於返回值型別的討論 呼叫者堆疊裡返回乙個物件效...

C 過載操作符

過載操作符 一 過載操作符的定義 1.過載操作符的結構 返回型別 operator 需要過載的操作符 形參列表 注意 形引數目應和運算元數目相同。2.過載操作符的幾條注意事項 1 過載的操作符名不能通過連線其他合法符號來建立任何新的操作符。如 2 過載操作符必須具備至少乙個類型別或列舉型別的運算元。...

c 操作符過載

過載操作符 一 限制 1 不能增加新的操作符 2 有些操作符不能過載,如.物件中的訪問成員 作用域解析操作符 sizeof 三元操作符 3 不能改變操作符的元數,元數是指與操作符相關的引數或運算元個數。比如一元操作符 只能應用於乙個操作符 4 不能改變操作符的優先順序 5 不能重新定義內建型別的操作...