C 03 運算子過載

2021-08-30 08:52:44 字數 2800 閱讀 5775

運算子過載的目的:讓物件的運算表現的和內建型別的運算一樣。

運算子過載函式,返回值一般不會是void,例如:連續的=就無法用void實現,一般用類型別的引用,可以保證連續運算。

class ccomplex   複數類

~ccomplex()

ccomplex(const ccomplex &src):mreal(src.mreal), mimage(src.mimage)

ccomplex& operator=(const ccomplex &src) 只要返回的物件還存在就返回引用

ccomplex operator+(const ccomplex &src) 由於返回的是區域性變數,出函式析構,所以不能返回引用

private:

int mreal;

int mimage;

};int main()

運算子過載為全域性函式時,引數的個數等於運算子的目數(即運算元的個數)。為了使用類裡的私有成員所以寫成友元函式。

運算子過載為成員函式時,引數的個數等於運算子的目數減一。

編譯器尋找物件的成員方法時,如果物件沒有相應的運算子過載,就會去全域性尋找運算子過載函式。

/*

c++的字串操作 string型別

*/class cmystring

private:

char *mpstr;

friend ostream& operator<<(ostream& out, const cmystring& srv);

friend cmystring operator+(const cmystring&src, const cmystring& srv);

};ostream& operator<<(ostream& out, const cmystring& srv) 全域性函式

《這玩意也是個二目的,但右側是cout不是物件,所以你沒辦法寫再成員函式裡

也是全域性的 +也是個二目,而且兩側都是物件,為啥不寫裡面??

原因:你有可能是cmystring str2 = str1 + "ccc"或cmystring str1 = "ddd" + str2;

首先說前面內個:這個可以呼叫類裡的成員函式,將ccc隱式的轉換為類型別,再相加,沒毛病。

但對後面這個來說,由於左側是字串,不是類型別,所以你只能寫成全域性函式外。

但你沒必要一次寫倆+的過載吧,所以為保證這倆都能成功,直接乙個全域性搞定。

cmystring operator+(const cmystring&src, const cmystring& srv)

int main()

return 0;

}

其他型別  轉  類型別,看有沒有合適的建構函式

類型別  轉  其他型別,提供型別過載函式    

這倆無法共存,因為如果存在編譯器就不清楚要呼叫哪個。

test t1;

t1 = 20;其他型別 轉 類型別 會呼叫test(20)顯示生成臨時物件。

class cint

//方法一: 類型別 轉換 為整形

operator int& () 如果沒有&,返回得到就是乙個立即數,立即數是無法++的,所以應該返回引用

//方法二:使用運算子過載,將整形與物件的成員進行操作

bool operator<(const cint &src)

void operator++()

int& operator(int *ar)//返回引用,及支援讀又能支援寫

private:

int ma;

};int main()

; cint i = 0;

for ( ; i < 5; ++i)

cout << endl;

return 0;

}

如果物件有小闊號()運算子過載函式,稱為函式物件,看起來像函式但其實是物件。

對於++運算子過載:

前置++與後置++是有區別的。

ccomplex operator++(int)  // a++ 後置++

ccomplex& operator++() //++a 前置++

由上面可知,使用前置++,效率會更好。

下列運算子不允許過載:

. , .* , :: , ?:,siezof

過載new和delete :

為什麼要過載new和delete?

1、出於效率考慮:也許要建立和銷毀乙個特定的類的非常多的物件以至於這個運算變成了速度的瓶頸。

2、堆碎片:分配不同大小的記憶體可能會在堆上產生很多碎片,以至於很快用完記憶體。雖然記憶體可能還有,但是由於都是碎片,也就找不到足夠大的記憶體塊滿足需要。通過為特定類建立自己的記憶體分配器,可以確保這種情況不會發生。

編譯器看到new時,編譯器分配記憶體並呼叫建構函式,但是當過載new時,可以改變的只是記憶體分配部分。

過載的new必須有乙個size_t引數。這個引數由編譯器產生並傳遞給我們,它是要分配記憶體的物件的長度。

void* operator new(size_t sz)

返回值是乙個void*,而不是指向任何特定型別的指標。所做的只是分配記憶體。

參考博文:

取餘運算怎麼算 C 03運算子優先順序

表示式1,表示式2,表示式3.include int main c語言隨機數函式 這裡區別於指標的 和 變數 表示變數先 1 1 再返回表示式的值。若運算子在變數後則表示先使用變數,然後變數 1 1 include int main a 1 a 3a 3 a 1 1 0 1 a 1,b 1分析 第七...

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

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

C 運算子過載賦值運算子

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