當要對乙個自定義的物件進行運算時(運用運算子操作物件),就需要運算子過載。
平時int,float,double型別可以直接用+,-,*,/符號進行運算,《進行輸出。但是自己定義的物件(class)卻不可以用他們進行運算,但是int 等也是乙個物件(class),這就是說明我們自定義的物件也可是使用運算子進行操作,但是底層運算子並沒有辦法幫我們定義我們的物件運算,這個時候就需要我們過載運算子,來支援我們的自定義兌現進行操作。
*1.運算子。
運算子就是操作符,對運算子前乙個變數進行操作,並返回乙個資料型別。可以先簡單認為+,-,*,/ 和 函式呼叫運算子 「 . 」 一樣。
(friend 先排除友緣過載)
int c= int a +int b;// c = a.operator+( int b)// a呼叫+號對b操作,返回個 int。
int a+=int bint b) // a呼叫+=號對b操作,返回個 int。
2.運算子過載
(1)當過載友元函式時,將沒有隱含的引數this指標。這樣,對雙目運算子,友元函式有2個引數,對單目運算子,友元函式有乙個引數。
(2)有些執行符不能過載為友元函式,它們是:=,(),和->。
(3)運算子過載的時候要嘛使用友元,要嘛使用成員,二者選其一,不要在乙個類中對乙個運算子同時用這兩種方法過載,會出現二義性,編譯器無法編譯。(原因在於友元不屬於任何物件,沒有作用域,只能在類內定義,沒有this指標,而成員函式有this指標。)
1.const test operator+(const test & other);
//const test operator+(this,const test & other);
2.friend const test operator+(test &intvalue, const test & other);
test3=test1+test2;//同時定義,test1就都可以呼叫1和2,編譯器就會報錯
tips:一元運算子,復合賦值運算子,建議過載為成員函式。(+= ,-=,&=,等),因為都是對物件自身的操作,並返回自己。其他的建議用友元過載。
先定義乙個stone類,類有數量和重量屬性,現在計算現有石頭的總重。
class
stone
stone
(float weight,
int number)
:m_weight
(weight)
,m_number
(number)
//red 呼叫了+=,所以this指向red的資料結構。
stone operator+=
(const stone &stonefollowing)
friend ostream &
operator
<<
(ostream &out,
const stone& st)
//2.
/*friend stone operator +=(const stone &stonebefore, const stone &stonefollowing)
*/protected:}
;stone.cpp
friend
&operator
<<
(ostream &out,
const stone& st)
void
teststone()
解釋下this指標
stone a+=stone b;
stone operator +=(const stone &stonefollowing)
為什麼用友元:
如果是過載雙目操作符(即為類的成員函式),就只要設定乙個引數作為右側運算量,而左側運算量就是物件本身。。。。。。
而 >> 或<< 左側運算量是 cin或cout 而不是物件本身,所以不滿足後面一點。。。。。。。。就只能申明為友元函式了。。。
如果一定要宣告為成員函式,只能成為如下的形式:
ostream & operator<<(ostream &output)
return output;
所以在運用這個《運算子時就變為這種形式了:data《不合符人的習慣
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 運算子過載轉換運算子
為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...