c 運算子過載

2021-10-02 04:04:48 字數 4273 閱讀 6428

加法運算子過載

分別可以通過成員函式全域性函式進行

#include

using

namespace std;

class

person

public

:int m_a;

int m_b;};

//第二種全域性函式過載

person operator

+(person &p1,person &p2)

void

test()

intmain()

左移運算子過載

不用成員函式:無法實現cout在左側

可以用全域性函式

試一下使用成員函式寫出來,發現不行

class

person..

.;}//顯然是不行的,那麼試一下全域性函式

再用全域性函式實現

#include

#include

using

namespace std;

class

person

;//採用全域性函式進行過載

void

operator

<<

(ostream &cout,person &p)

//ostream為標準輸出流

void

test()

intmain()

再試一下cout<2 intellisense: 無法確定需要哪個 過載函式 "endl" 例項如果還是返回cout,再接上<&

operator

<<

(ostream &cout,person &p)

遞增運算子過載

寫在成員函式中

分別為前置遞增後置遞增

#include

#include

using

namespace std;

class

myint

//前置++運算子

myint &

operator++(

)//後置++運算子

myint operator++(

int)

private

:int m_int;};

//左移運算子

ostream &

operator

<<

(ostream &cout,myint &p)

//前置++測試

void

test01()

//後置++測試

void

test02()

intmain()

賦值運算子過載

#include

#include

using

namespace std;

class

person

int*m_age;

//定義乙個指標};

void

test01()

intmain()

這裡進行執行直接通過了,我們再在成員函式中加乙個析構函式進行釋放記憶體

~

person()

//寫一下析構函式,並且釋放指標指向記憶體

}

再執行一下發現程式直接崩了,原因是原本系統給我們的類中的拷貝建構函式是進行的淺拷貝,到後面進行賦值過後,兩個指標同時指向同乙個記憶體

當第乙個指向的記憶體位址為空,再進行釋放,那麼就會出現問題

解決辦法:自己寫乙個拷貝建構函式,只不過是內部是進行深拷貝

//寫乙個賦值 運算子成員函式在類中

void

operator

=(person &p)

//淺拷貝寫法 m_age = p.m_age,也就是系統給我們寫得

m_age =

newint

(*p.m_age)

;//開闢新的記憶體空間給m_age,也就是深拷貝

}

此時執行通過

那當我們再建立乙個物件

person p3(30

)//在test01中

p3 = p2 = p1 //此時再執行程式

1	intellisense: 沒有與這些運算元匹配的 "=" 運算子
分析:此時我們應當為自己寫的拷貝建構函式增添乙個返回值 使p3 等於乙個物件,而不是空 (在進行p2 = p1時,函式並沒有返回什麼,是void型別,那麼就會出錯)

解決:

//寫乙個賦值 運算子函式

person &

operator

=(person &p)

//淺拷貝寫法 m_age = p.m_age,也就是系統給我們寫得

m_age =

newint

(*p.m_age)

;//開闢新的記憶體空間給m_age,也就是深拷貝

return

*this

;//*this返回物件本身

}

再進行執行程式,就可以通過了

完整賦值運算子過載**:

#include

#include

using

namespace std;

class

person

~person()

//寫一下析構函式,並且釋放指標指向記憶體

}//寫乙個賦值 運算子函式

person &

operator

=(person &p)

//淺拷貝寫法 m_age = p.m_age,也就是系統給我們寫得

m_age =

newint

(*p.m_age)

;//開闢新的記憶體空間給m_age,也就是深拷貝

return

*this;}

int*m_age;};

void

test01()

intmain()

———————————————————————————————————

關係運算子重置

完整**:

#include

#include

using

namespace std;

class

person

//關係運算子==重置

bool

operator

==(person &p)

else

}//關係運算子!=重置

bool

operator

!=(person &p)

else

}public

: string name;

int age;};

void

test01()

else

if(p1 != p2)

else

}int

main()

別的關係運算子也差不多

呼叫運算子過載

也就是(),又稱為仿函式

特點是:沒有固定的寫法,十分靈活

#include

#include

using

namespace std;

class

myprint};

class

myadd};

void

test01()

void

test02()

intmain()

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

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

C 運算子過載賦值運算子

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

C 運算子過載轉換運算子

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