C Primer 第十四章 過載操作符與轉換

2022-02-23 05:28:48 字數 4361 閱讀 2613

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 輸入和輸出操作符 輸出操作符應輸出物件的內容,進行最小限度的格式化 輸入操作符...