c 運算子過載使用說明

2021-10-05 12:30:17 字數 3808 閱讀 6686

運算子過載概念:

對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別

一般有+,左移,遞增,賦值,關係函式呼叫這幾種運算子過載

基本形式為

返回型別 operator @ (參數列)
(1)+運算子過載

person+int型別

```cpp

person operator+

(person &p,

int num)

全域性函式person operator+(person &p1,person &p2)

person operator

+(person &p1,person &p2)

person+person型別

person operator

+(person &p)

下面是例項

#include

using

namespace std;

class

person

*/int m_a;

int m_b;};

//全域性函式過載本質是person p3=operator(p1+p2)

person operator

+(person &p1,person &p2)

person operator

+(person &p,

int num)

void

test01()

intmain()

執行結果如圖

(2)左移運算子過載

左移運算子過載有幾點需要注意

cout<

"hello world"

<

這是乙個鏈式程式設計,輸出p1之後需要返回值為cout型別,而cout的型別是ostream,所以需要使用 ostream& 進行過載

#include

using

namespace std;

class

person

private

:int m_a;

int m_b;};

ostream&

operator

<<

(ostream& out,person& p )

void

test01()

intmain()

執行結果是

(3)遞增運算子過載

前置++和後置++的區別

int a=10;

cout<<

++a<

//11

cout<

//11

int b=10;

cout<

+<

//10

cout<

//11

前置運算子返回的是指標,後置運算子返回的是數值,二者靠int區別

想輸出類cout<

#include

using

namespace std;

class

myinteger

//前置遞增運算子++也寫後面,靠(int)與後置區分

myinteger&

operator++(

) myinteger operator++(

int)

private

:int num;};

ostream&

operator

<<

(ostream& out,myinteger myint)

void

test01()

void

test02()

intmain()

執行結果是

(4)賦值運算子過載

c++編譯器至少給乙個類新增4個函式

1.預設建構函式(無參,函式體為空)

2.預設析構函式(無參,函式體為空)

3.預設拷貝建構函式,對屬性進行值拷貝

4.賦值運算子operator=,對屬性進行值拷貝

如果類中有屬性指向堆區,做賦值操作時也會出現深淺拷貝問題

淺拷貝會帶來堆區記憶體重複釋放的問題,造成系統崩潰,這個問題就要用深拷貝解決,即開闢一塊新的記憶體

對深淺拷貝不太了解的,可以看一下我之前寫的文章深淺拷貝

下面是例子

#include

using namespace std;

class

person

//賦值運算子過載

//編譯器提供的是淺拷貝,m_age=p. m_age

person& operator=

(person &p)

m_age=new int

(*p.m_age)

;//開闢一塊新記憶體

return

*this;

//返回本身,滿足鏈式結構

}~person(

)//析構函式釋放堆區記憶體 }

int* m_age;};

void test01(

)int main(

)

執行結果如下

(5)關係運算子過載

關係運算子: , ==, !=

#include

using namespace std;

class

person

bool operator==

(person p)

else

}bool operator!=

(person p)

else

} string m_name;

int m_age;};

void test01(

)else

if(p1!=p2)

else

}int main(

)

執行結果如下

(6)函式呼叫運算子過載()

·函式呼叫運算子()也可以過載

·由於過載後使用的方式非常像函式的呼叫,因此稱為仿函式

·仿函式沒有固定寫法,非常靈活

#include

using namespace std;

class

myprint};

void test01(

)class

myadd};

void test02(

)int main(

)

執行結果如下

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

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

C 運算子過載賦值運算子

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

C 運算子過載轉換運算子

為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...