算符重載是通過函數實現的,它本質上是函數重載。運算符重載函數除了函數名有特定的格式,其它地方和普通函數並沒有區別。
操作符重載規則
- 並不是所有的運算符都可以重載。
- 重載不能改變運算符的優先級和結合性
- 重載不會改變運算符的用法,原有有幾個操作數、操作數在左邊還是在右邊,這些都不會改變
- 運算符重載函數既可以作爲類的成員函數,也可以作爲全局函數。
+= -= 類似操作返回值最好類的引用,不然會多一次拷貝構造。
在類中實現
在類中實現和在類外實現的區別
- 類外實現需要在類中聲明爲友元函數
- 在類中實現則成爲成員函數,第一個參數爲this指針。在類外可自定義參數
9 using namespace std;
10 class A{
11 public:
12 int m_a;
13 A operator+(const A& A1){
14 A A2;
15 A2.m_a = this->m_a + A1.m_a;
16 return A2;
17 }
18 A():m_a(10){}
19 void print(){
20 cout<<"m-a "<<this->m_a;
21 }
22 };
以全局函數重載+ 以成員函數重載+=
爲甚麼:
- +運算符具有左結合性
- Complex c2 = c1 + 15.6;可以實現 ,但是Complex c3 = 28.23 + c1;不能實現
對於+=來說定義在類內部(成員函數)只需要一個參數,this自動隱藏。更加安全。
轉換構造函數
當參數不能完全匹配時,可以通過轉換構造函數對參數進行轉化。
重載>>和<<
注意:流參數(istream和ostream) 不能加const,返回值一定要是引用,不然不能連續輸出。
友元函數在類中聲明
friend istream& operator>>(istream& is, A& other);
friend ostream & operator<<(ostream & out, const A& other);
類外定義
istream& operator>>(istream& is,A& other){
is >> other.m_a;
return is;
}
ostream& operator<<( ostream& os,const A&other){
os << other.m_a << endl;
return os;
}
重載前置++和後置++
用一個佔位參數來區分前置++和後置++