運算子過載

2021-10-03 21:16:56 字數 3237 閱讀 1078

在研究類的預設成員函式的時候我們接觸到了運算子過載,其中包括賦值操作符過載 取位址操作符過載 const 修飾的取位址操作符的過載

這一節我們主要來研究一下賦值運算子以及·加加減減的過載

運算子的過載實際上是對運算子函式的過載來實現的

話不多說直接上**來看

#define _crt_secure_no_warnings 

#include

using

namespace std;

class

complex

void

display()

; complex operator+(

const complex &c)

;//二元加重載成員函式

complex operator-(

const complex &c)

;//二元減重載成員函式

complex operator-(

);//一元過載成員函式};

void complex::

display()

complex complex::

operator+(

const complex &c)

complex complex::

operator-(

const complex &c)

complex complex::

operator-(

)int

main()

通過這段**我們發現,通過對於運算子的過載可以實現對於類的想要操作,語法通過**也就很明顯的展現出來

函式型別 + operator + 過載的運算子(形參列表)

過載類的成員函式的時候,引數個數 = 原運算元個數 -1(後置++,前置++除外);

當類的物件呼叫這種運算子函式的時候,物件中的成員資料就是乙個運算元,另乙個運算元通過引數傳遞來獲得。

看完這 很多人應該想問為啥引數個數等於原來運算元減1?

this指標不知道你是否還記得?

當運算元為雙目運算子的時候,其中乙個運算資料是物件本身的資料,由this指標給出,另乙個運算元的資料需要傳引數來確定,(當然,特殊情況狂特殊考慮),運算子是單目運算子的時候,運算元直接由this指標給出,就不需要任何函式來傳遞。

類的友元函式的過載

運算子過載為類的友元函式時,所需要的運算元必須通過函式形參來傳遞。

上面我們剛提到了this指標,在學習友元的時候我們說友元函式沒有this指標,所以引數傳遞就只有是形參來傳遞了。

也分為兩種情況:

當運算子為雙目運算子時,以加號為例 a+b 實際上就是 operator+(a,b);

當運算子為單目運算子的時候 比如後置減減,實際上就是呼叫函式operator–(a);

具體怎麼樣直接上**看實際情況中的操作

class

complex

void

display()

;friend complex operator-(

const complex &c1,

const complex &c2)

;//二元過載減友元函式

friend complex operator-(

const complex &c)

;//一元過載減友元函式

friend complex operator+(

const complex &c1,

const complex &c2)

;//二元過載加友元函式};

void complex::

display()

complex operator-(

const complex &c1,

const complex &c2)

complex operator-(

const complex &c)

complex operator+(

const complex &c1,

const complex &c2)

intmain()

我們可以發現,在友元函式過載的過程中,函式引數 = 原來運算元的個數,至少有乙個自定義型別的形式引數,在呼叫這種運算子函式的時候,所有的運算元都要通過引數傳遞來獲得。

友元函式不能過載的運算子

= ()-> 。

接下來就是我們學習c++過程中經常需要實現的多種運算子的過載:

一·. ++和–的過載

主要還是強調一下後置++ --的過載操作,前置操作在前面實現複數運算的時候已經實現,主要是後置時候的操作,我們需要增加乙個int型別的引數,在呼叫時,引數int並不參與運算,只是用來區分過載函式。

話不多說,直接上**:

class

test

;test::

test

(int num1,

int num2)

test test::

operator++(

)test test::

operator--(

)void test::

display()

test test::

operator++(

int)

test test::

operator--(

int)

再來看常用的 = 的過載

有乙個引用引數,為了防止對賦值號右邊進行拷貝,從而提高函式執行時效率,

函式返回了引用而不是物件,這樣,賦值建構函式不如使用引用引數和返回引用更加有效。

例如:

class

string

~string()

void

print()

string &

operator

=( string & s)

;//函式返回引用更為有效};

string &string::

operator

=(string &s )

else

}int

main()

這樣就完成了賦值運算子的過載,其實根據類私有成員的不同,過載的方式是不同的,具體還要看怎麼實現,掌握語法和原理很重要,在接下來的學習中一起看啊。

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

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

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

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

運算子過載

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