C 學習筆記4 運算子過載

2021-10-21 14:53:42 字數 4688 閱讀 2907

七、不同型別資料間的轉換

給運算子賦予新的運算功能。

運算子的過載需要使用函式來實現,實質上是函式的過載

過載運算子的函式一般格式為:

函式型別 operator 運算子名稱 (形參表列)

例:過載運算子「+」,使之能用於兩個複數相加

#include

#include

using

namespace std;

class

complex

complex

(double r,

double i)

complex operator

+(complex &c2)

;//宣告過載運算子的「+」函式

(1)不允許自己定義新的運算子,只能對已有的c++運算子進行過載;

(2)不能過載的運算子

. (成員訪問運算子)

.* (成員指標訪問運算子)

:: (域運算子)

sizeof (長度運算子)

?:(條件運算子)

(3)過載不能改變運算子運算物件(即運算元)的個數

(4)過載不能改變運算子的優先級別

(5)過載不能改變運算子的結合性

(6)過載運算子不能有預設的引數

(7)過載的運算子必須和使用者定義的自定義型別的物件一起使用,其引數至少應有乙個類物件(或類物件的引用)

(8)用於類物件的運算子一般必須過載,但有兩個例外,運算子「 = 」和「 & 」

(9)運算子過載函式可以是類的成員函式,也可以是類的友元函式,還可以是即非類的成員函式也不是友元函式的普通函式。

#include

#include

using

namespace std;

class

complex

complex

(double r,

double i)

friend complex operator

+(complex &c1,complex &c2)

;//過載函式作為友元函式

void

display()

;private

:double real;

double imag;};

complex operator

+(complex &c1,complex &c2)

//定義友元函式的過載函式

從上面可以知道,當運算表示式的第乙個引數不是乙個類物件,或者運算子函式兩邊的型別不一樣時,應該使用上面的友元函式方式。

雙目運算子有兩個運算元,通常在運算子的左右兩側。如上面兩節內容。

單目運算子過載函式只有乙個引數,如果運算子過載函式作為成員函式,則可以省略此引數。

例:有乙個time類,包含資料成員minute 和 sec,模擬秒錶,每次走一秒,滿60秒進一分鐘,此時秒又從0開始計數。

#include

#include

using

namespace std;

class

time

//預設建構函式

time

(int m,

int s)

:minute

(m),

sec(s)

//建構函式重構

time operator++(

);//宣告運算子過載函式

void

display()

//定義輸出時間函式

private

:int minute;

int sec;};

time time::

operator++(

)//定義運算子過載函式

return

*this

;//返回當前物件值

}int

main()

return0;

}

c++的流插入運算子「<>」是類庫中提供的,已經在類庫的標頭檔案中進行了過載。

過載的格式:

istream & operator >> ( istream &,自定義類 &);

ostream & operator << ( ostream &,自定義類 &);

從上面可以看出,兩個引數的型別不一致,因此不能將過載函式定義為成員函式,只能作為友元函式和普通函式。

一般情況下,將雙目運算子函式過載為友元函式,單目運算子函式則多過載為成員函式。

例:用過載的「<

#include

#include

using

namespace std;

class

complex

complex

(double r,

double i)

complex operator

+(complex &c2)

;//運算子「+」過載為成員函式

friend ostream &

operator

<<

(ostream&

,complex&);

//運算子「<

private

:double real;

double imag;};

complex complex::

operator

+(complex &c2)

//定義運算子「+」過載函式

ostream &

operator

<<

(ostream& output,complex &c)

//定義運算子「<

從上面可以看出,對運算子過載之後,就可以輸出使用者自己定義的類物件。

例:在上面的基礎上,增加過載流提取運算子「>>」,用「cin >> 」輸入複數,用「 cou <

#include

#include

using

namespace std;

class

complex

;ostream &

operator

<<

(ostream& output,complex &c)

//定義運算子「<

istream &

operator

>>

(istream& input,complex &c)

//定義運算子「<

c++系統自動完成,這種轉換稱為隱式型別轉換。

還有一種顯式型別轉換,其形式為:

型別名(資料)例如int(89.5)

c語言中是:(型別名) 資料例如(int)89.5

轉換建構函式只有乙個形參,如

complex( double r)

其作用是將duoble型的形參轉換為complex類的物件,將r作為複數的實部,虛部為0。

類名(指定型別的資料)

用轉換建構函式可以將乙個指定型別的資料轉換為類的物件,但不能反過來,c++提供了型別轉換函式來解決這個問題。

型別轉換函式的作用是將乙個類的物件轉換成另一型別的資料。

型別轉換函式形式:

operator 型別名()

只能做成員函式,因為轉換的本體是本類的物件。

#include

#include

using

namespace std;

class

complex

complex

(double r,

double i)

operator

double()

//型別轉換函式

private

:double real;

double imag;};

intmain()

c 學習筆記 運算子過載

今天在看使用ceres擬合函式 的時候看到了運算子過載,由於c 當時沒學好現在也忘得差不多了,所以打算開始做乙個c 的學習筆記,看到哪寫到哪。今天看到的這段 如下 template bool operator const t const abc,t residual const 操作符過載的格式是 ...

C 學習筆記 運算子過載

自定義類可以過載運算子,大多數的運算子都是可以過載的,下表給出了那些運算子可以過載那些不可以過載。對於運算子的過載,我們需要明白運算子是如何呼叫的。非成員函式的運算子呼叫 d1 d2 表示式方式呼叫 operator d1,d2 等價的呼叫 成員函式的運算子呼叫方式 d1 d2 運算子呼叫 d1.o...

運算子過載學習筆記

定義乙個複數類complex,使之能用於複數的加法運算。編寫程式,求兩複試之和。ifndef complex h define complex h class complex endif include include complex.h complex complex complex comple...