14.1 過載操作符的定義
操作符(+ ,- , * , / , = , < , >)可以被內建型別使用,比如兩個整數相加或相減,兩個字串相加,兩個陣列比較大小等等。自定義類預設是不能使用大多數操作符的。自定義類是復合型別,相加或想減或比較大小並沒有相應的規則匹配:兩個類相加等於什麼? 兩個類如何確定誰大誰小? c++允許我們通過過載運算子的技術讓自定義物件支援這些操作。我們可以定義過載規則。
操作符過載語法很簡單: 關鍵字operator後接操作符 比如operator+
可以過載的操作符:+-
*/%^
&|~!
=>
<
+=-=
*=/=
%=^=
&=|=
>>
<<
>>=
<<=
==!=
>=
<=
&&||
++--
->*
,->
()operator new
operator new
operator delete
operator delete
不能過載的操作符:::.
.*? :
sizeof
typeid
newdelete
static_cast
dynamic_cast
const_cast
reinterpret_cast
過載操作符可以定義成類成員函式,也可以定義成非成員函式
class myclass;//
成員函式定義
myclass operator+(const myclass &obj) const
;int age;}//
等價的非成員函式定義
myclass operator+(const myclass &obj1, const myclass &obj2)
成員函式定義看起來少了乙個引數,實際上語法將this限定為第乙個運算元。大部分操作符允許定義為成員或非成員函式,具體如何定義看個人喜好。
+ 有些操作符只能定義為成員,如果定義成非成員會產生編譯錯誤賦值= 下標 呼叫() 箭頭訪問->都不允許定義成非成員函式。
+ 有些操作符只能定義為非成員,如輸入 << 輸出 >>操作符
+ 改變自身狀態的建議定義為成員函式,例如自增++ 自減-- 解引 復合操作+= -=等
+ 對稱操作符建議定義為非成員函式,例如加減+ - 比較 < == >
+ 成員函式中可以使用this而非成員函式中無法使用,因為函式不屬於任何物件。
過載操作符至少要包含乙個類型別運算元
myclass operator+(myclass *obj1, const myclass *obj2)// 運算元至少要包含乙個類型別,防止使用者修改內建型別的操作符,如果使用者定義int operator+(int a,int b)意味著使用者要修改int型別的加法操作符。
輸入操作符:
&ostream operator
<<(ostream &temp, const myclass &obj) //
第二個形參一般都作const限定因為它只做讀取操作
輸出操作符:
&istream operator>>(istream &temp, myclass &obj) //
第二個形參不能const限定,因為需要輸入內容到該引數中
輸入輸出操作符返回都必須是引用,且第乙個形參也是引用,前面章節中已說明 io物件無法複製或者賦值。
這兩個操作符只能定義成非成員函式,原因在於第一形參必須是io物件引用,而定義為成員函式時第乙個引數被省略且被限定為 this 所以只能定義成非成員函式。
算數運算子:
myclass operator+(const myclass &obj1, const myclass &obj2)
myclass operator-(const myclass &obj1, const myclass &obj2)
bool
operator==(const myclass &obj1, const myclass &obj2)
bool
operator>(const myclass &obj1, const myclass &obj2)
賦值=操作符:
myclass& operator=(const myclass &obj) //
賦值符左運算元是this 指向物件(當前類物件),賦值符號右運算元是形參obj 返回值必須是*this的引用
;下標操作符:
string
operator (const size_t index) //
返回左值(常量) 下標操作唯讀
string& operator (const size_t index) //
返回左值(引用) 下標操作可讀可寫
下標操作可實現const過載
string& operator (const size_t index) //
下標操作可讀可寫
const
string& operator (const size_t index) const
//下標操作唯讀
呼叫規則是 const物件呼叫const版,非const呼叫非const版
myclass a ;
a[1] ; //
呼叫非const版
const myclass b ;
b[1] ; //
呼叫const版
解引操作符:
class cls;}
class myclass
; //
解引返回具體類
cls *operator->(); //
箭頭返回類指標,實際使用時返回的指標會立刻再做系統的箭頭操作
const cls &operator*() const ; //
const過載版本
const cls *operator->() const ; //
const過載版本
private:
cls *sp;
}cls a;
myclass t(&a) ;
cls b = *t ; //
呼叫解引操作符,返回cls類物件
t->show(3) ; //
呼叫箭頭操作符,呼叫cls物件的show()方法
此時t是物件而不是指標,如果t是指標,則會呼叫系統解引和箭頭操作:
cls *j = &t;
*j ; //
返回 myclass物件
j->show(3) ; //
呼叫myclass物件的show方法,本例中myclass沒有定義方法,執行時報錯
自增操作符:
class myclass
,cur(ls){};
myclass &operator++(); //
++myclass過載,返回引用或物件
myclass operator++(int); //
myclass++過載,只能返回物件(不允許返回區域性物件的引用)
}myclass++過載多了形參int,只起到標識作用。
使用和內建類自增沒審美區別,自減和自增類似。
呼叫操作符:
class myclass;}
定義了呼叫操作符的類物件叫做 函式物件 ,因為他們的物件行為類似函式
myclass obj;
int j = obj(5) ; //
使用呼叫操作符過載函式 j = 7
轉換操作符:
class myclass
;private:
int a;
}在下列情況下函式執行:
1. 表示式中 1 + obj; 2 < obj;
2. 條件中 if(obj) 先轉換成int 在轉成bool
3. 傳參或返回值時
第十四章 過載操作與轉換 一
1 這4個符號不能過載 2 過載操作必須有乙個類型別的運算元 強制過載操作符不能重新定義在已有的內建型別中 3 優先順序和結合性是固定的 4 過載後 不再具有短路求值特性 1 必須作為非成員函式 2 輸出 ostream operator ostream os,const classtype obj...
第十四章 過載操作與轉換 二
14.9 轉換與類型別 1 轉換操作符 例子 class smallint operator int const 沒有返回型別,沒有引數列表,const型別 private stad size t val 2 只要存在轉換,編譯器就會在內建轉化的地方就會自動應用之,所以一般乙個類中乙個型別轉換就足夠...
第十四章 過載操作符與轉換
第十四章 過載操作符與轉換 1 過載操作符 保留字operator後接需定義的操作符符號 過載操作符不能重新定義用於內建型別物件的操作符,至少有乙個類型別或列舉型別 操作符定義為非成員函式時,必須設定為所操作類的友元 2 輸入和輸出操作符 輸出操作符應輸出物件的內容,進行最小限度的格式化 輸入操作符...