什麼是運算子的過載?
運算子與類結合,產生新的含義。
為什麼要引入運算子過載?
作用:為了實現類的多型性(多型是指乙個函式名有多種含義)
怎麼實現運算子的過載?
方式:類的成員函式 或 友元函式(類外的普通函式)
規則:不能過載的運算子有 . 和 .* 和 ?: 和 :: 和 sizeof
友元函式和成員函式的使用場合:一般情況下,建議一元運算子使用成員函式,二元運算子使用友元函式
1、運算子的操作需要修改類物件的狀態,則使用成員函式。如需要做左值運算元的運算子(如=,+=,++)
2、運算時,有數和物件的混合運算時,必須使用友元
3、二元運算子中,第乙個運算元為非物件時,必須使用友元函式。如輸入輸出運算子《和》
具體規則如下:
2. 引數和返回值
當引數不會被改變,一般按const引用來傳遞(若是使用成員函式過載,函式也為const).
對於返回數值的決定:
1) 如果返回值可能出現在=號左邊, 則只能作為左值, 返回非const引用。
2) 如果返回值只能出現在=號右邊, 則只需作為右值, 返回const型引用或者const型值。
3) 如果返回值既可能出現在=號左邊或者右邊, 則其返回值須作為左值, 返回非const引用。
運算子過載舉例:
+和 -運算子的過載:
呼叫:class point
point(point& p)
const point operator+(const point& p);//使用成員函式過載加號運算子
friend const point operator-(const point& p1,const point& p2);//使用友元函式過載減號運算子
};
const point point::operator+(const point& p)
point const operator-(const point& p1,const point& p2)
總結:1、由於+ -都是出現在=號的右邊,如c=a+b,即會返回乙個右值,可以返回const型值point a(1);
point b(2);
a+b; //正確,呼叫成員函式
a-b; //正確,調用友元函式
a+1; //正確,先呼叫型別轉換函式,把1變成物件,之後呼叫成員函式
a-1; //正確,先呼叫型別轉換函式,把1變成物件,之後調用友元函式
1+a; //錯誤,呼叫成員函式時,第乙個運算元必須是物件,因為第乙個運算元還有呼叫成員函式的功能
1-a; //正確,先型別轉換 後調用友元函式
2、後幾個表示式討論的就是,數和物件混合運算子的情況,一般出現這種情況,常使用友元函式
3、雙目運算子的過載:
過載運算子函式名:operator@(參數列)
隱式呼叫形式:obj1+obj2
顯式呼叫形式:obj1.operator+(obj obj2)---成員函式
operator+(obj obj1,obj obj2)---友元函式
執行時,隱式呼叫形式和顯式呼叫形式都會呼叫函式operator+()
++和--運算子的過載:
函式呼叫:class point
point operator++();//成員函式定義自增
const point operator++(int x); //字尾可以返回乙個const型別的值
friend point operator--(point& p);//友元函式定義--
friend const point operator--(point& p,int x);//字尾可以返回乙個const型別的值
};
point point::operator++()//++obj
const point point::operator++(int x)//obj++
point operator--(point& p)//--obj
const point operator--(point& p,int x)//obj--
呼叫:point a(1);
point b(2);
a++;//隱式呼叫成員函式operator++(0),字尾表示式
++a;//隱式呼叫成員函式operator++(),字首表示式
b--;//隱式調用友元函式operator--(0),字尾表示式
--b;//隱式調用友元函式operator--(),字首表示式
cout<
總結:1、a++
函式返回:temp(臨時變數)
函式返回是否是const型別:返回是乙個拷貝後的臨時變數),不能出現在等號的左邊(臨時變數不能做左值),函式的結果只能做右值,則要返回乙個const型別的值
++a函式返回:*this;
函式返回是否是const型別:返回原狀態的本身,返回值可以做左值,即函式的結果可以做左值,則要返回乙個非const型別的值
2、前字尾僅從函式名(operator++)無法區分,只能有引數區分,這裡引入乙個虛引數int x,x可以是任意整數。
3、單目運算子的過載:
過載運算子函式名:operator@(參數列)
隱式呼叫形式:obj1@ 或 @obj1
顯式呼叫形式:
成員函式:
obj1.operator@( )//字首
obj1.operator@(0)//字尾
友元函式:
operator@(obj obj)//字首
operator@(obj obj,int x)//字尾
執行時,隱式呼叫形式和顯式呼叫形式都會呼叫函式operator@()
過載下標運算子[ ]
class point
} int& operator(int y);
};
int& point::operator(int y)
else
}
point a;
for (int i=0;i<10;i++)
const int operator()(const point& p);
};
const int point::operator()(const point& p)
呼叫:
point a(1);
point b(2);
cout過載運算子( )的目的:
1、物件( ) 類似於 函式名(x),更加符合習慣
語法:過載方式:只能使用成員函式過載
過載後還可以繼續過載
函式名:operator( )(參數列)
參數列:引數隨意,具體根據實際情況而定。
函式呼叫:顯式呼叫:obj(x)
隱式呼叫:obj.operator( )(x)
返回型別:
1、返回成員的實際型別隨意,具體由程式設計師根據函式體定義
2、因為返回值只能做右值,唯讀,應該使用返回值為const型別
過載輸入輸出操作符<< >>
class point
friend ostream& operator<
friend istream& operator>>(istream& cin,point& p);//使用友元函式過載》輸出運算子
};
ostream& operator<
呼叫:
point a(1);
point b(2);
cin>>a>>b;
cout語法:
過載方式:只能使用友元函式過載 且 使用三個引用&
函式名:
輸出流: operator<
輸入流:operator>>(參數列)
參數列:固定(容易出錯啊),兩個引數均用引用&
輸出流: 必須是兩個引數:對輸出流ostream& 和 物件
第乙個運算元cout,定義在檔案iostream中,是標準類型別ostream的物件的引用。
如:ostream& cout,const point& p
輸入流:必須是兩個引數:對輸入流ostream& 和 物件
第乙個運算元是cin,定義在檔案iostream,實際上是標準類型別istream的物件的引用
如:instream& cin,const point& p
函式呼叫:
輸出流: 顯式呼叫:cout《物件
隱式呼叫: operator<
輸入流:顯式呼叫:cin>>物件
隱式呼叫: operator>>(cin,物件)
返回型別:返回型別固定 + 使用返回函式引用(滿足連續輸出)
輸出流: 返回ostream&
如:ostream& operator<
輸入流:返回:istream&
如:istream& operator>>(istream& cin,point& p)
注意:為什麼輸入輸出操作符的過載必須使用友元函式?
因為:成員函式要求是有物件呼叫,則第乙個引數必須是類的物件,但是《和》第乙個引數是流的物件引用。
故,不能使用成員函式
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 運算子過載轉換運算子
為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...