基本概念
①.過載運算子
過載的運算子是具有特殊名字的函數:由關鍵字 operator 和其後要定義的運算子號組成,也包括函數返回型別、參數列表及函數體。
②.函數參數
當一個過載運算子是成員函數時,它的左側第一個運算物件系結到 this 指針上,即函數的顯示參數數量比實際少一個。
③.過載運算子呼叫
可以使用普通的運算表達式間接的呼叫過載的運算子,也可以作爲普通函數顯示的呼叫。
data1+data2;//運算表達式間接呼叫
data1.operator+(data2);//等價的成員函數呼叫
輸入輸出運算子
①.函數構成
輸入輸出運算子過載函數的第一個形參是一個非 const 的 ostream\istream 物件的參照、第二個參數是要進行操作的物件的參照、函數返回對應的 形參 ostream\istream 物件的參照 。
②.非成員函數
和 標準庫相容的輸入輸出運算子必須是普通的非成員函數,不能是類的成員函數。
ostream & operator<<(ostream &os,const Sales_data &item)
{
os << item.isbin() << endl << item.revenue << endl;
return os;
}
算術運算子
①.函數構成
算術運算子過載函數的函數形參通常都是運算物件的 const 參照,函數返回計算後得到新物件的副本。
②.非成員函數
算術運算子和關係運算符通常定義成非成員函數,以允許對左側物件或者右側運算物件進行轉換。
Sales_data operator+(const Sales_data &item1,const Sales_data &item2)
{
Sales_data sum = item1;
sum.revenue += item2.revenue;
return sum;
}
③.關係運算符
關係運算符即判斷相等、小於、大於的運算子,一般定義了相等運算子也應該定義對應的不相等運算子。
賦值運算子
①.函數構成:賦值運算子過載函數返回左側運算物件的參照、右側運算物件可以是別的型別。
②.成員函數:賦值運算子過載函數一般都定義爲類的成員函數。
③.拷貝賦值運算子:右側物件是當前類的另外一個物件的 const 左值參照,需要判斷是否是自身賦值。
④.移動賦值運算子:右側運算物件當前類的另外一個物件的非 const 右值參照,需要判斷是否是自身賦值。
⑤.列表賦值:函數參數是花括號包含的元素列表
class StrVec
{
public:
StrVec & operator=(std::initializer_list<std::string>);
}
下標運算子
①.函數構成:表示容器的類通過下標運算子按位元置存取元素,函數返回所存取元素的參照。
②.成員函數:下標運算子必須是成員函數
③.函數版本:下標運算子通常需要過載兩個版本,即 const 版本和非 const 版本。
class StrVec
{
public:
string & operator[](std::size_t n){ return elements[n] ;}
const string & operator[](std::size_t n) const { return elements[n] ; }
}
函數呼叫運算子
①.概念:函數呼叫運輸符即 operator()
②.成員函數:函數呼叫運算子必須是成員函數
struct adsInt
{
int operator()(int val) const
{
return val < 0 ? -val:val;
}
}
int i = -42;
absInt obj;
int ui = obj(i);
型別轉換運算子
①.概念:型別轉換運算子一般形式爲:operator type( ) const,負責將一個類型別值轉換成其他型別;不能轉換爲陣列或者函數型別。
②.函數構成:型別轉換運算子不能宣告返回值型別,形參列表也必須爲空。
③.成員函數:型別轉換運算子必須是成員函數
class SmallInt
{
public:
SmallInt(int = 0):val(i) {}
operator int() const { return val;}
}
④.拒絕隱式轉換:使用 explicit 關鍵字修飾過載函數,但是當表達式做條件時將會隱身執行。
class SmallInt
{
public:
SmallInt(int = 0):val(i) {}
explicit operator int() const { return val;}
}
SmallInt si = 3;
int j = static_cast<int>(si);//顯示轉換
概念
①.字面量運算子:即形如 【operator 「」 後綴 ( )】的運算子函數;其中後綴可以自定義,比如:_C、KG等,建議以下劃線開始;operator ""和使用者自定義後綴直接必須有空格
②.字面量運算子過載函數:可以把字面值常數轉換成需要的型別物件;字面量運算子不可以是成員函數。
字面量型別
①.字面量爲整數,*那麼操作符函數只可接受 unsigned long long 或者 const char *作爲參數。
②.字面量爲浮點數,操作符函數只可接受 long double 或者 const char* 爲參數。
③.字面量爲字串,操作符函數只可接受 const char*,size_t爲參數。
④.字面量爲字元,則操作符函數只接受一個 char 爲參數。
字面量操作符使用
①.字串字面量
使用字面量操作符可以簡化函數參數的輸入,用字面值常數代替使用多個參數構造物件。
②.整數位面量
除去字串外,後綴宣告也可以作用於數值。