運算子過載

2021-06-29 16:01:10 字數 1629 閱讀 4071

0.類宣告

#pragma once

class cdog

;1.過載前置運算子 rettype operator op ();

宣告:void operator++ ()

定義:void cdog::operator++ ()

但這個運算子返回空,有時我們可能會有這樣的要求:

cdog a,i;

a = ++i;//這樣就出問題了,因為返回空!!

過載運算子的返回型別:

1)可以建立乙個臨時物件並返回它

宣告: cdog operator ++();

定義: cdog cdog::operator ++ ()

2)返回無名臨時物件,利用使用值初始化的建構函式構造出乙個物件並返回,如下:

宣告: cdog operator ++();

定義: cdog cdog::operator ++ ()

這種方法比第一種要簡單,但是仍有問題,因為每乙個物件的建立都在經過銷毀,這樣乙個臨時變數的存在會花銷很多時間!在上面中,物件i已經存在,我們可以利用this指標返回!

3)this指標

宣告: const cdog& operator ++();

定義: cdog cdog::operator ++ ()

返回的是乙個cdog的引用,所以避免建立臨時物件,這個返回值必須是常量!

2.過載後置運算子

前置與後置的區別:

前置:是先加1後取值

後置:是先取值再加1,這樣就有乙個問題,我們必須建立乙個臨時物件來儲存原來的值,然後再返回臨時物件

如下: int x = 5;

int a;

a = x++;//後置運算子

過程:先是 x 是 5 ,執行這句話後,a 是 5 ,但x卻是6了!!這樣,如果x是乙個物件,就必須儲存乙個臨時物件,然後使x的值加一,然後返回這個臨時物件給a。與上面this不同,我

們返回的是乙個臨時物件,所以不能返回它的引用,這是因為一旦函式返回臨時物件將超出作用域。

在上面的操作中,x 是本物件!!!

下面開始:

宣告: const cdog operator++ (int flag);//注意,這個引數只是用來區分前後置的,不參與運算

定義: const cdog cdog::operator++ (int flag)

3.過載加法運算子

自加是乙個單目運算子,它只作用於乙個物件,加法是乙個雙目運算子,涉及到兩個物件。

例如: a = x + y;

從這可以看出來,x + y返回的一定是乙個臨時物件

宣告: cdog operator+ (const cdog&)

定義: cdog cdog::operator+ (const cdog& c)//在這裡,this相當於x, 引數c相當於y,返回賦值給a

4.賦值運算子

(1)要檢查當前物件是否與正在被賦值的物件相同(通過物件位址)

宣告:cdog& operator= (const cdog&);

定義:cdog& cdog::operator= (const cdog& c)

編譯器預設的四個功能:一預設建構函式,預設析構函式,預設複製建構函式,預設賦值函式

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

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

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

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

運算子過載

c 中的運算子 1。大多數系統預定義運算子都能過載 不值得過載 不能被過載 2過載不能改變優先順序 不能改變結合性 不能改變運算子所需運算元的個數 過載後,可按這些運算子的表達方式使用 運算子過載的語法 一 通過運算子過載函式進行過載 1。運算子過載函式是成員函式 語法形式 type x opera...