不能過載的運算子有:. 和 :: 和 ?:和.*和sizeof
注意點1:
使用運算子過載的本質上是一次函式呼叫,所以這些關於運算物件的求值順序無法應用到過載的運算子上。
友元函式和成員函式的使用場合:
一般情況下,建議一元運算子使用成員函式,二元運算子使用友元函式
1、運算子的操作需要修改類物件的狀態,則使用成員函式。如需要做左值運算元的運算子(如 =,+=,++)
2、運算時,有數和物件的混合運算時,必須使用友元
3、二元運算子中,第乙個運算元為非物件時,必須使用友元函式。如輸入輸出運算子 << 和 >>
4、當乙個過載運算子是成員函式時,this 繫結到左側運算物件。成員運算子函式的顯式形參比運算物件的數量少乙個
5、可以直接呼叫乙個過載的運算子函式,如 operator+(data1, data2), data1.operator(data2)
6、當運算子作用於內建型別物件時,我們無法改變運算子的含義
如下運算子
建議使用
所有一元運算子
成員函式
= ( ) [ ] ->
必須是成員函式
+= -= /= *= ^= &= != %= >>= <<= , 似乎帶等號的都在這裡了.
成員函式
所有其它二元運算子, 例如: –,+,*,/
友元函式
<< >>
必須是友元函式
注意點2當引數不會被改變,一般按 const 引用來傳遞(若是使用成員函式過載,函式也為 const).對於返回數值的決定:
1) 如果返回值可能出現在 = 號左邊, 則只能作為左值, 返回非 const 引用。
2) 如果返回值只能出現在 = 號右邊, 則只需作為右值, 返回 const 型引用或者 const 型值。
3) 如果返回值既可能出現在 = 號左邊或者右邊, 則其返回值須作為左值, 返回非 const 引用。
也就是左值為非const,右值const
過載 -> 運算子:
#include
using
namespace std;
struct node
node
(string *s)
:ptr
(s)node()
=default
;private
: string* ptr;};
//string* operator->(const node&x)
intmain()
-> 操作符只能通過成員函式來過載,不能通過友元函式來過載。如果通過友元函式來過載,會報錯
->操作符的返回根據型別不同,(返回值 function)的解釋也不同。
如果返回型別值內建指標,那麼就相當於 解引用一下((*返回值).function );
如果返回型別是類的時候,那麼就相當於ptr.operator->()->function。
過載–和++運算子:
#include
//成員函式
using
namespace std;
class
node
~node()
node&
operator--(
)const node&
operator--(
int)};
void
print
(ostream& os,
const node&it)
intmain()
#include
//友元
using
namespace std;
class
node
;node&
operator
--(node&it)
const node operator
--(node&it,
int)
void
print
(ostream & os,
const node&x)
intmain()
注意
需要用乙個佔位符(虛引數)區分前字尾運算
後置時不要返回引用,不然會返回乙個區域性物件引用
過載運算子:
#include
using
namespace std;
class
node
node()
=default
;node
(int
*a)int
operator
(int in)
}private
:int x[
100];}
;int
main()
//【】的過載必須是非靜態成員過載
我們可以發現 只能作為成員函式過載,如果過載為友元函式的話會報錯:
過載()運算子
我們可以發現 () 只能作為非靜態成員函式過載,如果過載為友元函式的話會報錯:
#include
using
namespace std;
class
node
node
(int a):x
(a)const
intoperator()
(const node &it)
const};
intmain()
過載運算子 () 的目的:物件 () 類似於函式名 (x),更加符合習慣
語法:過載方式:只能使用成員函式過載
過載後還可以繼續過載
函式名:operator( )(參數列)
參數列:引數隨意,具體根據實際情況而定。
函式呼叫:顯式呼叫:obj(x)
隱式呼叫:obj.operator( )(x)
返回型別:
1、返回成員的實際型別隨意,具體由程式設計師根據函式體定義
2、因為返回值只能做右值,唯讀,應該使用返回值為const型別
過載》《運算子
#include
using
namespace std;
class
gelgel
(int a)
:gel
(a,0
)gel
(void):
gel(0,
0)~gel()
};// ostream& operator<<(const gel &it, ostream &os)
ostream&
operator
<<
(ostream &os,
const gel &it)
intmain
(void
)
#include
using
namespace std;
class
gelgel
(int a)
:gel
(a,0
)gel
(void):
gel(0,
0)~gel()
ostream&
operator
<<
(ostream &os)};
intmain
(void
)
過載 = 運算子:
= 只能作為成員函式過載,如果過載為友元函式的話會報錯:
自己打過acm,感覺這個東西沒什麼總結的,
詳細總結在這裡:
運算子過載之過載型別運算子
普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...
運算子過載 賦值運算子的過載
有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...
運算子過載
c 中的運算子 1。大多數系統預定義運算子都能過載 不值得過載 不能被過載 2過載不能改變優先順序 不能改變結合性 不能改變運算子所需運算元的個數 過載後,可按這些運算子的表達方式使用 運算子過載的語法 一 通過運算子過載函式進行過載 1。運算子過載函式是成員函式 語法形式 type x opera...