1. 程式人生 > >C++中操作符函數

C++中操作符函數

調用 tor 表達 編譯器 解引用 成員指針 成員變量 特殊 應該

一、操作符函數
在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++中操作符函數