一般情況下,單目運算符最好重載為類的成員函數粗蔚;雙目運算符則最好重載為類的友元函數。
以下一些雙目運算符不能重載為類的友元函數:=饶火、()鹏控、[]致扯、->。
類型轉換函數只能定義為一個類的成員函數而不能定義為類的友元函數当辐。 C++提供4個類型轉換函數:reinterpret_cast(在編譯期間實現(xiàn)轉換)抖僵、const_cast(在編譯期間實現(xiàn)轉換)、stactic_cast(在編譯期間實現(xiàn)轉換)缘揪、dynamic_cast(在運行期間實現(xiàn)轉換耍群,并可以返回轉換成功與否的標志)。
若一個運算符的操作需要修改對象的狀態(tài)找筝,選擇重載為成員函數較好蹈垢。
若運算符所需的操作數(尤其是第一個操作數)希望有隱式類型轉換,則只能選用友元函數袖裕。
當運算符函數是一個成員函數時曹抬,最左邊的操作數(或者只有最左邊的操作數)必須是運算符類的一個類對象(或者是對該類對象的引用)。如果左邊的操作數必須是一個不同類的對象急鳄,或者是一個內部 類型的對象谤民,該運算符函數必須作為一個友元函數來實現(xiàn)。
當需要重載運算符具有可交換性時疾宏,選擇重載為友元函數张足。
注意事項:
除了類屬關系運算符”.“、成員指針運算符”.*“坎藐、作用域運算符”::“为牍、sizeof運算符和三目運算符”?:“以外,C++中的所有運算符都可以重載岩馍。
重載運算符限制在C++語言中已有的運算符范圍內的允許重載的運算符之中吵聪,不能創(chuàng)建新的運算符抖单。
運算符重載實質上是函數重載捻爷,因此編譯程序對運算符重載的選擇,遵循函數重載的選擇原則绒怨。
重載之后的運算符不能改變運算符的優(yōu)先級和結合性赦肋,也不能改變運算符操作數的個數及語法結構块攒。
運算符重載不能改變該運算符用于內部類型對象的含義。它只能和用戶自定義類型的對象一起使用佃乘,或者用于用戶自定義類型的對象和內部類型的對象混合使用時囱井。
運算符重載是針對新類型數據的實際需要對原有運算符進行的適當的改造,重載的功能應當與原有功能相類似趣避,避免沒有目的地使用重載運算符庞呕。
#include <iostream>
#include <string>
using namespace std;
class Douary
{
public:
~Douary(){cout << "~Douary()\n";}
//explicit:防止隱式類型轉換
explicit Douary(int real = 0, int vir = 0)
{
m_iRow = real;
m_iCol = vir;
//cout << "Douary(int,int)" << endl;
}
void show()
{
cout << m_iRow << '+' << m_iCol << endl;
}
friend Douary operator+ (const Douary &d1
, const Douary &d2);
friend Douary operator- (const Douary &d1
, const Douary &d2);
friend Douary operator* (const Douary &d1
, const Douary &d2);
friend Douary operator/ (const Douary &d1
, const Douary &d2);
friend ostream& operator <<(ostream& out
, const Douary &dou);
friend istream& operator >>(istream &in
, Douary &dou);
private:
int *Array;
int m_iRow;
int m_iCol;
};
Douary operator+(const Douary &d1, const Douary &d2)
{
Douary dou;
dou.m_iRow = d1.m_iRow + d2.m_iRow;
dou.m_iCol = d1.m_iCol + d2.m_iCol;
return dou;
}
Douary operator-(const Douary &d1, const Douary &d2)
{
Douary dou;
dou.m_iRow = d1.m_iRow - d2.m_iRow;
dou.m_iCol = d1.m_iCol - d2.m_iCol;
return dou;
}
Douary operator* (const Douary &d1, const Douary &d2)
{
Douary dou;
dou.m_iRow = d1.m_iRow * d2.m_iRow;
dou.m_iCol = d1.m_iCol * d2.m_iCol;
return dou;
}
Douary operator/ (const Douary &d1, const Douary &d2)
{
Douary dou;
dou.m_iRow = d1.m_iRow / d2.m_iRow;
dou.m_iCol = d1.m_iCol / d2.m_iCol;
return dou;
}
ostream& operator <<(ostream& out, const Douary &dou)
{
out << dou.m_iRow << '+' << dou.m_iCol ;
return out;
}
istream& operator >>(istream &in, Douary &dou)
{
in >> dou.m_iRow >> dou.m_iCol;
return in;
}
void fun(Douary dou)
{
cout << dou << endl;
}
int main(void)
{
Douary dou(12, 18);
Douary dou1(2, 3);
Douary dou2;
dou2 = dou + dou1; //-->dou2=dou+Douary(34);
cout << dou2 << endl;
dou2 = dou - dou1;
cout << dou2 << endl;
dou2 = dou * dou1;
cout << dou2 << endl;
dou2 = dou / dou1;
cout << dou2 << endl;
cin >> dou2 ;
cout << dou2 << endl;
return 0;
}