您好,登錄后才能下訂單哦!
這篇文章主要介紹C++中運算符重載怎么用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
為什么要使用運算符重載
-C/C++的運算符,支持的數據類型,僅限于基本數據類型。
問題:一頭牛+一頭馬 = ?(牛馬神獸?)
一個圓 +一個圓 = ? (想要變成一個更大的圓)
一頭牛 – 一只羊 = ? (想要變成4只羊,原始的以物易物:1頭牛價值5只羊)
解決方案:
使用運算符重載
規則:
一斤牛肉:2斤豬肉
一斤羊肉:3斤豬肉
實現:
牛 + 牛 = ?豬肉
牛 + 羊 = ?豬肉
Cow類
> Cow.h #pragma once class Pork; class Sheep; class Cow{ //牛類 public: Cow(int weight = 0); //使用運算符重載, 實現 牛肉 + 牛肉 = 豬肉 Pork operator+(const Cow& cow); //使用運算符重載, 實現 牛肉 + 羊肉 = 豬肉 Pork operator+(const Sheep& sheep); private: int weight; //重量 }; _________________________________________________________________________________________________________________________________ > Cow.cpp #include "Cow.h" #include "Pork.h" #include "Sheep.h" Cow::Cow(int weight){ this->weight = weight; } //一斤牛肉換兩斤豬肉 Pork Cow::operator+(const Cow& cow){ return Pork((this->weight + cow.weight) * 2); } //一斤牛肉換兩斤豬肉, 一斤羊肉換三斤豬肉 Pork Cow::operator+(const Sheep& sheep){ int tmp = (this->weight * 2) + (sheep.getWeight() * 3); return Pork(tmp); }
Sheep類
> Sheep.h #pragma once //羊類 class Sheep{ public: Sheep(int weight = 0); int getWeight() const; private: int weight; //重量 }; _________________________________________________________________________________________________________________________________ > Sheep.cpp #include "Sheep.h" Sheep::Sheep(int weight){ this->weight = weight; } int Sheep::getWeight() const{ return weight; }
Pork類
> Pork.h #pragma once #include <string> using namespace std; class Pork{ //豬肉類 public: Pork(int weight = 0); string description() const; private: int weight; }; _________________________________________________________________________________________________________________________________ > Pork.cpp #include <sstream> #include "Pork.h" Pork::Pork(int weight){ this->weight = weight; } string Pork::description() const{ stringstream ret; ret << this->weight << "斤"; return ret.str(); }
main.cpp
#include <iostream> #include <Windows.h> #include "Cow.h" #include "Pork.h" #include "Sheep.h" using namespace std; int main(void) { Pork p1; Cow c1(100); Cow c2(200); Sheep s1(100); //調用運算符重載 Pork operator+(const Cow& cow); p1 = c1 + c2; cout << "牛 + 牛 = 豬肉:" << p1.description() << endl; //調用運算符重載 Pork operator+(const Sheep& c1); p1 = c1 + s1; cout << "牛 + 羊 = 豬肉:" << p1.description() << endl; //羊+牛會報錯, 因為沒有定義對應的羊+牛運算符重載 //p1 = s1 + c1; system("pause"); return 0; }
實現:
牛 + 牛 = ?豬肉
牛 + 羊 = ?豬肉
Cow類
> Cow.h #pragma once class Pork; class Sheep; class Cow{ //牛類 public: Cow(int weight = 0); //使用友元運算符重載, 實現 牛肉 + 牛肉 = 豬肉 friend Pork operator+(const Cow& c1, const Cow& c2); //使用友元運算符重載, 實現 牛肉 + 羊肉 = 豬肉 friend Pork operator+(const Cow& c1, const Sheep& s1); private: int weight; //重量 }; _________________________________________________________________________________________________________________________________ > Cow.cpp #include "Cow.h" Cow::Cow(int weight){ this->weight = weight; }
Sheep類
> Sheep.h #pragma once //羊類 class Sheep{ public: Sheep(int weight = 0); int getWeight() const; private: int weight; //重量 }; _________________________________________________________________________________________________________________________________ > Sheep.cpp #include "Sheep.h" Sheep::Sheep(int weight){ this->weight = weight; } int Sheep::getWeight() const{ return weight; }
Pork類
> Pork.h #pragma once #include <string> using namespace std; class Pork{ //豬肉類 public: Pork(int weight = 0); string description() const; private: int weight; }; _________________________________________________________________________________________________________________________________ > Pork.cpp #include <sstream> #include "Pork.h" Pork::Pork(int weight){ this->weight = weight; } string Pork::description() const{ stringstream ret; ret << this->weight << "斤"; return ret.str(); }
main.cpp
#include <iostream> #include <Windows.h> #include "Cow.h" #include "Pork.h" #include "Sheep.h" using namespace std; //要想訪問類的私有數據成員, 就把這個函數定義為友元 Pork operator+(const Cow& c1, const Cow& c2) { return ((c1.weight + c2.weight) * 2); } //要想訪問類的私有數據成員, 就把這個函數定義為友元 Pork operator+(const Cow& c1, const Sheep& s1) { return((c1.weight * 2) + (s1.getWeight() * 3)); } int main(void) { Pork p1; Cow c1(100); //100斤的牛 Cow c2(200); //200斤的牛 Sheep s1(100); //100斤的羊 //調用 friend Pork operator+(const Cow& c1, const Cow& c2); p1 = c1 + c2; cout << "使用友元 牛 + 牛 = 豬肉:" << p1.description() << endl; //調用 friend Pork operator+(const Cow& c1, const Sheep& s1); p1 = c1 + s1; cout << "使用友元 牛 + 羊 = 豬肉:" << p1.description() << endl; system("pause"); return 0; }
區別:
使用成員函數來實現運算符重載時,少寫一個參數,因為第一個參數就是this指針。
一般情況下,單目運算符重載,使用成員函數進行重載更方便(不用寫參數)
一般情況下,雙目運算符重載,使用友元函數更直觀
方便實現a+b和b+a相同的效果,成員函數方式無法實現。
例如: 100 + cow; 只能通過友元函數來實現
cow +100; 友元函數和成員函數都可以實現
特殊情況:
(1)= () [ ] -> 不能重載為類的友元函數!!!(否則可能和C++的其他規則矛盾),只能使用成員函數形式進行重載。
(2)如果運算符的第一個操作數要求使用隱式類型轉換,則必須為友元函數(成員函數方式的第一個參數是this指針)
注意:
同一個運算符重載, 不能同時使用兩種方式來重載,會導致編譯器不知道選擇哪一個(二義性)
以上是“C++中運算符重載怎么用”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。