挑戰C++程式語言 ─第13章 運算子的覆載
本章主題 夥伴函式與this指標 覆載的基本觀念 串流運算子覆載 一元運算子覆載 二元運算子覆載
夥伴函式 夥伴函式(Friend Functions)指的是被定義在類別外的一個函式,但是它具有權力可以存取類別中的所有資料成員
this指標 this是C++的一個保留字,它是一個指向物件自己的指標。所有的操作成員均會有this這個隱含的引數
覆載的基本觀念 傳統的程式語言: 覆載早已經存在了。舉例來說,無論是針對整數、浮點數或雙倍精度浮點數,它們的除法都是用同一個運算子 / ,而除法運算子會依運算元的資料型態,使用正確的程式碼來加以運算。 同樣地,加法、減法、乘法也是具有這樣的性質 這些運算子是否也適用於新定義的類別?
定義運算子覆載 在運算子的前面加上operator這個保留字來形成覆載函式的名稱。例如operator+()就是加法運算子的覆載操作函式 定義函式的引數個數與引數的資料型態: 基本上,一元運算子的引數個數為零個,而二元運算子須要一個引數 對於 ++ 和 -- 這兩個特殊的一元運算子,有前置式(如++x)與後置式(如x++)的差別,因此,必須用一個引數來加以分辨
串流運算子<<和>>的覆載 C++在iostream類別庫中定義了ostream (Output Stream)和istream (Input Stream)兩個分別用來作輸出與輸入的類別,cout是ostream的一個案例,而cin則是istream的案例 除了iostream類別庫之外,針對其它類別定義 << 和>> 覆載操作函式時,絕對不能將函式定義為該類別的成員函式,必須以夥伴函式
串流運算子<<和>>的覆載
一元運算子 - 取址運算子& &運算子如果為一元運算的話,它是用來取出變數在記憶體中的位址,而如果是二元運算的話,則是用來對兩個運算元做AND布林運算 C++會為所有新定義的類別預設其覆載函式,也就是說,如果類別定義中無operator & ()函式,我們仍然可以對這個類別作取址的運算,其結果會傳回該類別物件的位址
一元運算子 - !運算子 ! 運算子在C++語言中,代表的是布林運算中的NOT 可以將其定義為類別的操作成員之一,也可以把它定義在類別外以夥伴函式的方式來完成operator ! ()函式的定義
一元運算子 - ++與--運算子 這兩個運算子分別可以有兩種不同意義的運作形式:前置運算與後置運算 前置運算之覆載函式的定義與一般一元運算子的覆載函式相同,若定義為類別的操作成員之一,並不需要引數。若是以夥伴函式的方法定義在類別外,則須加上一個引數 後置運算的定義方式,則是在函式中額外再加上一個輔助引數,其資料型態必須為int,且其值永遠等於0
一元運算子 - ++與--運算子
二元運算子 - 足標運算子[] 足標運算子(subscription operator)[] 是用來取出陣列(array)資料結構中的某一個元素 當編譯程式看到像x[y]的敘述時,會呼叫x.operator[](y),其中x是一個類別的物件,而y則是位置引數 operator[]()只能被定義成為類別的操作成員之一,也就是不可以用夥伴函式的方法定義[]運算子覆載函式
二元運算子 - 足標運算子[]
設值運算子 = C++會為每個類別預設一個設值運算子覆載函式,其中採取了將資料成員逐一拷貝的方式完成設值的動作 當資料成員中含有屬於指標型態的時候,這樣的預設動作通常不是我們所想要的 定義設值運算子覆載函式,也就是operator = (type)必須注意到三個要點: operator = (type)一定要被定義成為類別的操作成員之一,不能夠以夥伴函式或是類別外一般函式的形式來定義; 可以定義多個設值運算子覆載函式,隨著每個函式的引數型態不同,可以接收不同型態資料的設值動作 所有的設值運算覆載函式的回傳型態都應該設成該類別的參考型態