一、操作符函數重載
什麼是操作符函數:在C++中針對類類型的對象的運算符,由于它們肯定不支援真正的運算操作,是以編譯器會将它們翻譯成函數,這種就叫作操作符函數(運算符函數)。
編譯器把運算翻譯成運算符函數,可以針對自定義的類類型設計它獨有的運算功能。
其實各種運算已經具備一些功能,再次實作它的就是叫作運算符重載。
-
雙目運算符:
a+b
成員函數
a.operator+(b);
全局函數
operator+(a,b);
-
單目運算符:
!a
成員函數
a.operator!(void);
全局函數
operator!(a);
二、雙目操作符函數重載
成員函數:
const 類 operator#(const 類& that) const
{
return 類(參數#參數);
}
注意:雙目錄運算符的運算結果是個右值,傳回值應該加 const,然後為了const對象能夠調用參數應寫 const,函數也應該具備 const 屬性。
全局函數:
const 類 operator#(const 類& a,const 類& b)
{
}
注意:全局函數不是函數,可能會通路類的私有成員,解決這種問題可以把函數聲明為類的友元函數(友元不是成員)。
友元:在類的外部某個函數中想通路類的私有成員(public/protected/private)時,需要所在的函數聲明為友元,但友元隻是朋友,是以它隻有通路權,沒有實際的擁有權(其根本原因是它沒 this 指針)。
友元聲明:把函數的聲明寫一份到類中,然後在聲明前加上 friend 關鍵字,使用友元既可把操作符函數定義為全局的,也可以確定類的封裝性。。
注意:友元函數與成員函數不會構成重載關系,因為它們不在同一個作用域内。
三、指派類型的雙目操作符
1、擷取單參構造成指派運算的調用方式。
String str = “sunll”; // 會調用單參構造,而不調用指派運算符
str = “hehe”;
2、左操作資料不能具有 const 屬性
1、成員函數不能是常函數
2、全局函數第一個參數不能有 const 屬性
3、傳回值應該都(成員/全局)具備 const 屬性。
四、單目操作符函數重載
成員
const 類 operator#(void)
{
}
全局
const 類 operator#(const 類& that)
{
}