天天看點

重載運算與類型轉換

14.重載運算與類型轉換

14.1基本概念

1.重載的運算符是具有特殊名字的函數,由operator和需要重載的運算符組成的函數名,該函數同樣需要傳回類型、參數清單和函數體。且參數清單必須包含類成員或對象,我們不能重載隻包含内置類型的運算符,因為他們都是編譯器已經定義好了的。

2.成員運算符必須參數清單第一個參數是類成員或對象

3.重載運算符的調用:

//一個非成員運算符函數的等價調用

data1 + data2;

operator + (data1 , data2); //類似于普通函數的調用

//一個成員運算符函數的等價調用

data1 + data2;

data1.operator + (data2);

4.因為求值順序的原因,通常情況下,不應該重載逗号、取位址、邏輯與和邏輯或運算符。

5.重載版本應與内置類型版本在傳回類型和操作上一緻,避免運算符重載的濫用。

6.指派(=)、下标([ ])、調用(())、和成員通路箭頭(->)運算符必須是成員;符合指派運算符(如+=、-=)一般來說應該是成員,但不是必須;像++、--、*等會改變對象狀态的運算符或者與給定類型密切相關的運算符應該是成員;

其他的運算符一般是非成員。

const對象隻能調用const成員函數,否則會報如下錯誤:

不能将“this”指針從“const sales_data”轉換為“sales_data &” 1> 轉換丢失限

14.2

1.重載輸入輸出運算符時,為了保持其連續性,通常令其傳回一個引用,且輸出運算符應盡量減少格式化操作,使使用者可以控制輸出的細節;輸入運算符則必須唏噓處理輸入可能失敗的情況,并将其恢複。

2.如果類同時定義了算術運算符和相關的複合指派運算符,則通常情況下應該使用複合指派來實作算術運算符。

3.如果某個類在邏輯上有相等性的含義,則該類應該定義operator ==和!=,這兩個運算符應該吧工作委托給另外一個,一個負責比較操作,另一個負責調用那個真正工作的運算符。

4.如果存在唯一一種邏輯可靠的<定義,則應該考慮為這個類定義<運算符,如果類同時還包含==,則當且僅當<的定義和==産生的結果一緻時(兩個對象并且那個都不必另一個小)才定義< 運算符。

5.指派運算符必須定義為非靜态成員,符合指派運算符通常也應該這樣做,且兩類運算符都應該傳回左側運算對象的引用。

6.下标運算符必須是成員函數,通常會定義兩個版本,一個傳回一個普通引用,另一個是類的常量成員且傳回常量引用普通重載形式無法區分前置和後置遞增遞減運算符,是以我們令後置版本接受一個額外的(不被使用的)int類型的形參。因為我們不會用到int形參,是以無須為其命名。

7.箭頭運算符必須是類的成員,解引用通常是,但并非必須。

繼續閱讀