標籤:函式宣告 出現 友元 作用 工具 ret 操作符函數 返回 解釋
一、操作符函數
在C++中,編譯器有能力把一個由資料、對象和操作符共同組成的運算式,解釋為對一個全域或成員函數的調用。
該全域或成員函數被稱為操作符函數,通過重定義操作符函數,可以實現針對自訂類型的運演算法則,並使之與內建類型一樣參與各種運算式。
二、雙目操作符運算式
成員函數
形如L#R雙目操作符運算式,將被編譯器解釋為 L.operator#(R)
a-b+c == a.operator-(b).operator+(c)
全域函數
形如L#R的雙目操作符運算式,將被編譯器解釋為 ::operator#(L,R)
a-(b+c) == ::operator-(a,::operator+(b,c))
三、單目操作符運算式
成員函數
形如#O或O#的單目動作表達式,將被編譯器解釋為 O.operator#(),唯一的運算元是調用對象。
全域函數
形如#O或O#的單目動作表達式,將被編譯器解釋為 ::operator#(O),唯一的運算元是調用對象。
四、典型的雙目運算子多載
成員函數
Point operator /+-*%|^& (Point& that)
{
Point t; // 會調用無參構造
t.x = x / that.x;
t.y = y / that.y;
return t; // 不能返回局部對象的引用,否則會出現懸Null 參考
}
注意:原對象的值不變,要產生一個臨時的對象
bool operator > < >= <= == != || && (Point& that)
{
}
Point& operator += -= *= /= (Point& that)
{
return *this;
}
注意:運算子的重載要符合情理。
全域函數
可能會訪問到參數的私人成員:
1、把成員變成公開,但會破壞類的封閉性。
2、把全域函式宣告為友元(友元不是成員),
3、不能在友元函數中直接存取成員變數。
Point operator + (Point& a,Point& b)
{
Point t(a.x+b.x,a.y+b.y);
return t;
}
五、典型的單目運算子多載
成員函數:
前++/--
Point& operator ++/-- (void)
{
}
後++/--
Point operator ++/-- (int)
{
}
全域函數:
前++/--
Point& operator ++/-- (Point&)
{
}
後++/--
Point operator ++/-- (Point&,int)
{
}
六、輸入、輸出運算子多載
輸入、輸出運算子不能重載為成員函數,只能是友元。
ostream& operator << (ostream& os,Point& p)
{
}
istream& operator >> (istream& is,Point& p)
{
}
七、特殊的運算子的重載
[] 下標運算子,可以把對象當作數組來使用。
() 函數運算子,可以把對象當作函數來使用。
-> 成員訪問運算子,可以把對象當作指標來使用。
* 解引用運算子,可以把對象當作指標來使用。
new/delete 也可以進行重載,但不建議使用。
new會自動調用重載的new函數再建構函式。
delete會先調用析構再調用重載的delete函數。
只有極個別的運算子的重載對於對象來說是有意義(>>,<<)
八、運算子多載的一些限制
1、不能重載的運算子
:: 範圍限定符
. 成員訪問運算
.* 成員指標解引用
?: 三目運算子
sizeof 位元組長度運算子
typeid 類型資訊操作符
2、運算子的重載改變不了運算子的優先順序
3、無法改變運算子的操作個數
4、無法發明新的運算子
5、重載運算子要注意運算子的一致性
不要改變運算子預設的運算規則
6、運算子的重載是為了方便使用、增強可讀,不應該成功賣弄的工具。
C++中操作符函數