C++運算符重載
C++運算符重載是C++中一個非常重要的概念,很多初學者(包括我)在剛開始學習的時候非常害怕,甚至討厭(也許是惡心)。但是,不得不說的是,它真的很重要,學會之后很方便(ZhuangBi)。
加號運算符重載
加號是一個典型的雙目運算符(需要兩個操作數),加號前一個,加號后一個。實現加號運算符重載有兩種方式:1.類成員方法實現、2.全局方法實現
1.類成員方法實現
談一下我對加號運算符重載的理解,因為如果不理解原理,就會覺的運算符重載語法有點(變態),如果只想知道實現方法的請直接跳到代碼部分。
在沒有使用運算符重載之前,我們實現兩個自定義類型相加通常都是使用類成員函數實現的。比如下圖這種:
其中 p1.addPerson(p2) 就等價於 p1 + p2
而加號的運算符重載也是一個函數,不過名字比較奇怪而已:operator+( )
可以理解為,兩個對象相加時等價於 p1.addPerson(p2) 然后經過編譯器優化后,可以簡寫為 p1 + p2。所以在成員方法實現運算符重載時僅僅需要傳入一個參數(另外一個是隱藏的this指針)。
我想表達的意思大概就像上圖這樣,基本上就是 p1 + p2 只是 p1.operator+ (p2) 這個比較奇怪函數的簡寫,而這個函數本身和addPerson()沒什么區別,僅僅是名字上的區別而已。
類成員方法實現 完整代碼
1 #include <iostream> 2 using namespace std; 3 4 class Person { 5 public: 6 Person(); 7 Person(int val); 8 Person operator+(const Person& p);//運算符重載 函數定義 9 private : 10 int m_age; 11 }; 12 13 int main() { 14 Person p1; 15 Person p2; 16 Person p3 = p1 + p2;//重載后的效果 17 return 0; 18 } 19 20 Person::Person() :m_age(10) { 21 cout << "無參構造函數" << endl; 22 } 23 Person::Person(int val) : m_age(val) { 24 cout << "有參構造函數" << endl; 25 } 26 Person Person:: operator+(const Person& p) {//運算符重載 實現 27 Person tmp; 28 tmp.m_age = this->m_age + p.m_age; 29 return tmp; 30 }
2.全局方法實現
對於全局方法的實現,就類似於定義了一個全局函數實現兩個對象相加,如下圖:
而運算符重載函數(下面完整代碼的13~17行),也只是一個具有特殊名稱(operator+)的相加函數而已,它和 add 函數沒有本質上的區別。
調用上也應該是一樣的 operator+( p1, p2),不過我們不能這么寫,而是寫了 p1 + p2 ,在編譯器內部把這個表達式 當作 operator+( p1, p2 )處理。
全局方法實現 完整代碼
1 #include <iostream> 2 using namespace std; 3 4 class Person { 5 public: 6 friend Person operator+(Person& p1, Person& p2);//把全局方法設為友元函數,便於訪問私有變量 7 Person() :m_age(0) {}//初始化一個值 8 Person(int val) :m_age(val) {} 9 private: 10 int m_age; 11 }; 12 //2.全局的重載方法 13 Person operator+(Person& p1, Person& p2) { 14 Person tmp; 15 tmp.m_age = p1.m_age + p2.m_age; 16 return tmp; 17 } 18 19 int main() { 20 Person p1(10); 21 Person p2(11); 22 Person p3 = p1+p2; 23 return 0; 24 }