運算子過載的實質
運算子過載:對已有的運算子賦予多重含義,實質是函式過載,它提供了c++的可擴充套件性。
實現機制
轉化: 運算表示式轉化為對運算子函式的呼叫, 運算物件轉化為運算子函式的實參。 編譯系統對過載運算子的選擇,遵循函式過載的
選擇原則:目前可以簡單地理解為通過函式的參數列判斷呼叫的是過載中的哪個函式。
運算子過載規則
過載運算子的限制
不能過載的運算子
成員訪問運算子.『.』 在類中對任何成員都有意義,已經成為標準用法。
作用域運算子::
成員指標訪問運算子 .*
為了處理特殊情況而設計,在一般程式設計中通常不需要用到條件運算子 ? :
這個運算子對於類物件來說沒有實際意義,相反還會引起歧義
sizeof 不要當作普通的運算子
可以過載的運算子
算術運算子:+,-,,/,%,++,–;
位操作運算子:&,|,~,^(位異或),<>(右移);
邏輯運算子:!,&&,||;
比較運算子:<,>,>=,<=,==,!=;
賦值運算子:=,+=,-=,=,/=,%=,&=,|=,^=,<<=,>>=;
其他運算子: , () , -> , ,(逗號運算子) , new , delete , new , delete , ->*
注意:
過載運算子函式可以對運算子作出新的解釋,但原有基本語義不變:
不改變運算子的優先順序
不改變運算子的結合性
不改變運算子所需要的運算元個數。
只能過載c++語言中已有的運算子,不能建立新的運算子。
經過載的運算子,其運算元中至少應該有乙個是自定義型別。
用友元函式過載運算子
運算子過載為類的友元函式, 如果需要過載乙個運算子,使之能夠用於操作某類物件的私有成員,可以此將運算子過載為該類的友元函式。
函式的形參代表依自左至右次序排列的各運算元。
友元函式沒有 this 指標,所需運算元都必須在參數列顯式宣告,很容易實現型別的隱式轉換
c++中不能用友元函式過載的運算子有 = () [] ->
例 複數運算
#include
using
namespace std;
class
complex
complex
(int a)
void
print()
const
;friend complex operator+(
const complex &c1,
const complex &c2 )
;friend complex operator-(
const complex &c1,
const complex &c2 )
;friend complex operator-(
const complex & c )
;//前置一元運算子過載
private
:double real, imag ;
};例 複數運算
complex operator+(
const complex & c1,
const complex & c2 )
complex operator-(
const complex & c1,
const complex & c2 )
complex operator-(
const complex & c )
void complex ::
print()
const
//構造返回物件
過載 ++ 與 –設 a aobject ;
運算子 ++和 - - 有兩種方式:
前置方式: ++aobject --aobject
後置方式: aobject ++ aobject –
成員函式 過載 a :: a operator++ () ;
解釋為: aobject . operator ++( ) ;
友元函式 過載 friend a operator++ (a &) ;
解釋為: operator ++( aobject ) ;
成員函式 過載 a :: a operator++ (int) ;
解釋為: aobject . operator ++( 0 ) ;
友元函式 過載: friend a operator++ (a &, int) ;
解釋為: operator++(aobject, 0)
成員函式過載++
#include
using
namespace std;
class
increase
void
display()
const
; increase operator++(
);// 前置
increase operator++(
int)
;// 後置
private
:unsigned value ;};
increase increase ::
operator++(
)increase increase ::
operator++(
int)
intmain()
友元函式過載++
#include
using
namespace std;
class
increase
void
display()
const
;friend increase operator
++( increase &);
// 前置
friend increase operator
++( increase &
,int);
// 後置
運算子過載之過載型別運算子
普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...
運算子過載 賦值運算子的過載
有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...
運算子過載
c 中的運算子 1。大多數系統預定義運算子都能過載 不值得過載 不能被過載 2過載不能改變優先順序 不能改變結合性 不能改變運算子所需運算元的個數 過載後,可按這些運算子的表達方式使用 運算子過載的語法 一 通過運算子過載函式進行過載 1。運算子過載函式是成員函式 語法形式 type x opera...