C++ 運算符重載_加號


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM