七、不同型別資料間的轉換
給運算子賦予新的運算功能。
運算子的過載需要使用函式來實現,實質上是函式的過載
過載運算子的函式一般格式為:
函式型別 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...