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

2022-01-11 13:43:53 字數 2633 閱讀 4251

賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。

對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c++編譯器會為該類提供乙個預設的過載賦值運算子成員函式。

預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件。

過載賦值運算子函式必須是public的,否則會編譯錯誤,因為使用者定義了過載賦值運算子函式,編譯器就不會提供預設的。

在類中過載的賦值運算子函式不能被繼承!

通常情況下編譯器提供的預設過載賦值運算子函式能夠解決物件間賦值的問題,但是當類中含有指標資料成員時,容易引起指標懸掛的問題,

所以這種情況下有必要進行賦值運算子過載。

舉乙個例子,下面的程式使用預設的過載賦值運算子函式,在linux下執行會檢

測到double free的問題,其實還有乙個記憶體洩漏的問題(使用valgrind工具檢測),即指標懸掛。

原因是物件之間賦值時,物件s2的指標成員pstr的值被賦值成物件s1的指標成員pstr的值,這時物件s2中申請的堆空間就被遺忘了,程式結束時沒有人釋放,

同時s2物件析構時,釋放的是所s1申請的堆空間,s1物件析構時,就產生了2次釋放的問題。

#include 

#include using

namespace

std;

class

mystring

~mystring()

void display(void)

private

:

char *pstr;

intcount;

};int main(void

)/** valgrind 結果

invalid free() / delete / delete / realloc()

leak summary:

definitely lost: 6 bytes in 1 blocks

**/ 

下面使用自定義賦值運算子過載來解決記憶體洩漏和2次釋放的問題。

#include #include 

using

namespace

std;

class

mystring

~mystring()

void display(void)

//operator overload : =

mystring& operator=(mystring& ref

)

return (*this

); }

private

:

char *pstr;

intcount;

};int main(void

)

下標運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。

由於既可以作為左值又可以作為右值,所以過載下標運算子函式通常返回引用。

於其他運算子過載有一點不同的是:過載的功能是多樣的,完全取決於使用者的定義,但是通常是陣列相關的。

過載的下標運算子函式只能有乙個引數,即使用的方式只能是 aclss[para],不能沒有引數或者是aclss[para1, para2]多引數的形式。

例子:通過過載下標運算子,可以很方便的取得和修改類中的陣列。

#include using

namespace

std;

class

myarrary

//operator overload :

int& operator(int num)//

返回引用才能進行賦值操作

return

arr[num];

}private

:

int arr[4

];};

int main(void

)

括號運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。

由於()既可以作為左值又可以作為右值,所以過載括號運算子函式通常返回引用。

過載括號運算子函式的引數個數沒有限制,甚至沒有引數都可以。

例子:通過過載括號運算子,可以很方便的取得和修改類中的陣列。

#include using

namespace

std;

class

darrary

void display(void)

//operator overload : () multiple parameters

int& operator()(int a, int

b)

//operator overload : () singal parameter

int& operator()(int

a)

//operator overload : () none parameter

int& operator()(void

)

private

:

int arr[3][3

];};

int main(void

)

運算子過載之過載型別運算子

普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...

運算子過載 賦值運算子的過載

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...

C 運算子過載賦值運算子

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