C++中操作符函數
一、操作符函數
在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; // 不能返回局部對象的引用,否則會出現懸空引用
}
註意:原對象的值不變,要產生一個臨時的對象
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++中操作符函數