C Primer 過載操作符與轉換

2021-06-18 08:31:20 字數 2030 閱讀 9313

1.    不能通過連線其他合法符號來建立任何新的操作符,例如試圖定義乙個operator**操作符以提供求冪操作是非法的;用於內建型別的操作符其含義不能改變,例如 int operator+(int, int)就是非法的;也不能為任何內建型別定義額外的新的操作符,例如不能定義接受兩個陣列型別運算元的operator+-----(陣列時內建型別??)

注意:過載操作符必須具有至少乙個類型別或列舉型別的運算元,這條規則強制中載操作符不能重新定義用於內建型別物件的操作符的含義。

2操作符過載後不再具備短路求值特性,不保證運算元的求值順序,尤其是不會保證內建邏輯and,邏輯or,和逗號操作符的運算元求值。因此,過載&&,||或逗號操作符不是一種好選擇。

3大多數過載操作符可以定義為普通非成員函式或類的成員函式,作為類的成員函式,其形參看起來比運算元數目少1,因為有乙個隱含的this形參,限定為第乙個運算元。一般將算術和關係操作符定義為非成員函式,而將賦值操作符定義為成員。

4.過載逗號,取位址,邏輯與,邏輯或等操作符通常不是好做法,這些操作符具有有用的內建含義,如果定義自己的版本,就不能再使用這些內建含義。

5輸出操作符《的過載:為了與標準庫一致,操作符應接受ostream&作為第乙個運算元,對類型別const物件的引用作為第二個運算元,並返回對ostream形參的引用

ostream &

operator <<(ostream& os,const classtype &object)

io操作符必須為非成員函式,例如,如果將該操作符定義為類的成員,左運算元將只能是該類型別的物件,

sales_item item; item<

這個用法與為其他型別定義的輸出操作符的正常使用方式相反如果想要支援正常用法,則左運算元必須為ostream,而定義為類的成員函式時,this限定為第乙個運算元,由此產生矛盾。

6輸入操作符》的過載:第乙個運算元是乙個引用,指向它要讀的流,並且返回同乙個流的引用,第二個運算元是對要讀入的物件的非const引用,該運算元必須為非const,因為輸入操作符的目的就是將資料讀入到這個物件中。

istream &

operator>>(istream & in,sales_item& s)

注意:輸入操作符和輸出操作符的區別在於:輸入操作符必須處理錯誤和檔案結束的可能性。

7.相等操作符:如果類定義了operator==也應該定義operator!=,這兩者應該是相互定義,乙個操作符完成比較物件的實際工作,而另乙個只是呼叫前者。

8.下標操作符必須定義為類的成員函式,定義下標操作符時,一般需要定義兩個版本,乙個為非const成員並返回引用,另乙個為const成員並返回const引用。

9.箭頭操作符 必須定義為類成員函式,解引用操作符不要求定義為類成員,但將它作為成員一般也是正確的。

10.c++不要求將自增或自減操作符一定定義為類的成員,但是這樣的操作改變了物件,所以更傾向於定義為類的成員。為了區分字首式和字尾式操作符,字尾式操作符接受乙個額外的(無用)int形參,使用字尾操作符時,編譯器提供0作為這個形參的實參,儘管字首式操作符也可以使用這個額外的形參,但通常不這樣做,這個形參的唯一作用是將字首式操作符和字尾式操作符區分開來。如:

checkptr& operator++();

checkptr& operator++(int);

11.呼叫操作符和函式物件:

過載函式呼叫操作符(必須宣告為成員函式)

struct asbint };

int i = -42;

absint absobj;

unsigned int ui = absobj(i);

儘管absobj是乙個物件而不是函式,我們仍然可以「呼叫」該物件,定義呼叫操作符的類,其物件常稱為函式物件,即它們是行為類似函式的物件。

12.轉換操作符,定義將類型別值轉變為其他型別值得轉換,在類定義體內宣告(自然必須是成員函式),在保留字operator之後跟著轉換的目標型別,不能指定返回型別,並且形參表必須為空,而且轉換操作符一般不改變被轉換的物件,所以通常定義為const成員。

class smallint ;

轉換函式採用如下通用形式:

operator type();

c Primer,十四,過載操作符與轉換

第十四章 過載操作符與轉換 c 定義了許多內建型別間的操作符和自動轉換。像 等,使用這些很簡單自然,另外在沒學習類之前,貌似我們沒有什麼必要去重新定義乙個 的操作,因為他們已經很好的工作了,在有了類型別之後,我們可能會希望我定義的兩個類物件可以像內建型別那樣實現 操作,完成兩個類物件的相加。過載操作...

過載 操作符 c primer

istream operator istream in,sales item s double price in s.isbn s.units sold price check that the inputs succeeded if in s.revenue s.units sold price ...

過載操作符與轉換

過載操作符函式 保留字operator後接需要定義的操作符號,有返回型別和形參表 不能過載的操作符有 不能通過連線其他合法符號來建立任何新的操作符 過載操作符必須具有乙個類型別運算元,以為如果只有內建型別物件的話,會重新定義原來的操作符 操作符的優先順序和結合性是固定的 不再具備短路求值特性 當運算...