C++——重载运算符和重载函数
重載運算符和重載函數
C++ 中的函數重載
C++ 中的運算符重載
C++?一元運算符重載
C++?二元運算符重載
C++?關系運算符重載
C++?輸入/輸出運算符重載
C++?賦值運算符重載
C++?函數調用運算符 () 重載
C++?下標運算符 [] 重載
重載運算符和重載函數
C++ 允許在同一作用域中的某個函數和運算符指定多個定義,分別稱為函數重載和運算符重載。
重載聲明是指一個與之前已經在該作用域內聲明過的函數或方法具有相同名稱的聲明,但是它們的參數列表和定義(實現)不相同。
當您調用一個重載函數或重載運算符時,編譯器通過把您所使用的參數類型與定義中的參數類型進行比較,決定選用最合適的定義。選擇最合適的重載函數或重載運算符的過程,稱為重載決策。
C++ 中的函數重載
在同一個作用域內,可以聲明幾個功能類似的同名函數,但是這些同名函數的形式參數(指參數的個數、類型或者順序)必須不同。不能僅通過返回類型的不同來重載函數。
#include <iostream>using namespace std;class PutData { public:void Put_Data(int num){cout <<"整數為: "<< num << endl ;}void Put_Data(double fl){cout <<"浮點數為: " << fl << endl ;}void Put_Data(char ch){cout << "字符為: "<< ch << endl ;} };void main() {PutData pd ;pd.Put_Data(5);pd.Put_Data(6.6);pd.Put_Data('c'); }/*輸出結果為 整數為: 5 浮點數為: 6.6 字符為: c */C++ 中的運算符重載
您可以重定義或重載大部分 C++ 內置的運算符。這樣,您就能使用自定義類型的運算符。
重載的運算符是帶有特殊名稱的函數,函數名是由關鍵字 operator 和其后要重載的運算符符號構成的。與其他函數一樣,重載運算符有一個返回類型和一個參數列表。
Box operator+(const Box&);聲明加法運算符用于把兩個 Box 對象相加,返回最終的 Box 對象。大多數的重載運算符可被定義為普通的非成員函數或者被定義為類成員函數。如果我們定義上面的函數為類的非成員函數,那么我們需要為每次操作傳遞兩個參數,如下所示:
Box operator+(const Box&, const Box&); #include <iostream> using namespace std;class Line { public:Line(int num);int Get_Lenth();Line operator+(const Line& L); private:int Lenth ; };Line::Line(int num) {Lenth = num ; }int Line::Get_Lenth() {return Lenth; }Line Line::operator+(const Line& L) {Line line(12) ;line.Lenth = this->Lenth + L.Lenth ;return line ; }void main() {Line line1(5);Line line2(10);Line line3(0);line3 = line1 + line2 ;cout << "Line3 的長度是" << line3.Get_Lenth() << endl ; }/*輸出結果為 Line3 的長度是15 */C++?一元運算符重載
一元運算符只對一個操作數進行操作,下面是一元運算符的實例:
- 遞增運算符( ++ )和遞減運算符( -- )
- 一元減運算符,即負號( - )
- 邏輯非運算符( ! )
一元運算符通常出現在它們所操作的對象的左邊,比如 !obj、-obj 和 ++obj,但有時它們也可以作為后綴,比如 obj++ 或 obj--。
#include <iostream>using namespace std ;class Distance { private:int Dis1 ;int Dis2 ; public:Distance(int dis1 , int dis2){cout << "creat a object" << endl ;Dis1 = dis1 ;Dis2 = dis2 ;}void DisplayDis(){cout << "Dis1 is " << Dis1 << endl << "Dis2 is " << Dis2 << endl;}Distance operator- (){Dis1 = -Dis1 ;Dis2 = -Dis2 ;return Distance(Dis1 , Dis2);} };void main() {Distance d1(10,20);d1.DisplayDis();-d1;d1.DisplayDis(); }/*輸出結果為 creat a object Dis1 is 10 Dis2 is 20 creat a object Dis1 is -10 Dis2 is -20 */C++?二元運算符重載
二元運算符需要兩個參數,下面是二元運算符的實例。我們平常使用的加運算符( + )、減運算符( - )、乘運算符( * )和除運算符( / )都屬于二元運算符。就像加(+)運算符。
#include <iostream>using namespace std ;class Distance { private:int Dis1 ;int Dis2 ; public:Distance(int dis1 , int dis2){cout << "creat a object" << endl ;Dis1 = dis1 ;Dis2 = dis2 ;}void DisplayDis(){cout << "Dis1 is " << Dis1 << endl << "Dis2 is " << Dis2 << endl;}Distance operator-(const Distance &dis){Distance d(0,0) ;d.Dis1 = this->Dis1 - dis.Dis1;d.Dis2 = this->Dis2 - dis.Dis2;return d ;} };void main() {Distance d1(10,20);Distance d2(5,5);Distance d3(0,0);d3 = d1 - d2 ;d3.DisplayDis(); }/*輸出結果為 creat a object creat a object creat a object creat a object Dis1 is 5 Dis2 is 15 */C++?關系運算符重載
C++ 語言支持各種關系運算符( < 、 > 、 <= 、 >= 、 == 等等),它們可用于比較 C++ 內置的數據類型。
您可以重載任何一個關系運算符,重載后的關系運算符可用于比較類的對象。
#include <iostream>using namespace std ;class Distance { private:int Dis1 ;int Dis2 ; public:Distance(int dis1 , int dis2){cout << "creat a object" << endl ;Dis1 = dis1 ;Dis2 = dis2 ;}void DisplayDis(){cout << "Dis1 is " << Dis1 << endl << "Dis2 is " << Dis2 << endl;}bool operator<(const Distance &dis){if(this->Dis1 < dis.Dis1){return true ;}else if(this->Dis1 > dis.Dis1){return false ;}else {return false ;}} };void main() {Distance d1(10,20);Distance d2(5,5);if(d1 < d2){cout << "d1 小 " << endl ;}else{cout << "d2 小 " << endl ;} }/*輸出結果為 creat a object creat a object d2 小 */C++?輸入/輸出運算符重載
C++ 能夠使用流提取運算符 >> 和流插入運算符 << 來輸入和輸出內置的數據類型。您可以重載流提取運算符和流插入運算符來操作對象等用戶自定義的數據類型。
在這里,有一點很重要,我們需要把運算符重載函數聲明為類的友元函數,這樣我們就能不用創建對象而直接調用函數。
#include <iostream> using namespace std;class Distance {private:int feet; // 0 到無窮int inches; // 0 到 12public:// 所需的構造函數Distance(){feet = 0;inches = 0;}Distance(int f, int i){feet = f;inches = i;}friend ostream &operator<<( ostream &output, const Distance &D ){ output << "F : " << D.feet << " I : " << D.inches;return output; }friend istream &operator>>( istream &input, Distance &D ){ input >> D.feet >> D.inches;return input; } }; int main() {Distance D1(11, 10), D2(5, 11), D3;cout << "Enter the value of object : " << endl;cin >> D3;cout << "First Distance : " << D1 << endl;cout << "Second Distance :" << D2 << endl;cout << "Third Distance :" << D3 << endl;return 0; }/*輸出結果為 Enter the value of object : 15 15 First Distance : F : 11 I : 10 Second Distance :F : 5 I : 11 Third Distance :F : 15 I : 15 */C++?賦值運算符重載
就像其他運算符一樣,您可以重載賦值運算符( = ),用于創建一個對象,比如拷貝構造函數。
#include <iostream> using namespace std;class Distance {private:int feet; // 0 到無窮int inches; // 0 到 12public:// 所需的構造函數Distance(){feet = 0;inches = 0;}Distance(int f, int i){feet = f;inches = i;}void operator=(const Distance &D ){ feet = D.feet;inches = D.inches;}// 顯示距離的方法void displayDistance(){cout << "F: " << feet << " I:" << inches << endl;}}; int main() {Distance D1(11, 10), D2(5, 11);cout << "First Distance : "; D1.displayDistance();cout << "Second Distance :"; D2.displayDistance();// 使用賦值運算符D1 = D2;cout << "First Distance :"; D1.displayDistance();return 0; }/*輸出結果為 First Distance : F: 11 I:10 Second Distance :F: 5 I:11 First Distance :F: 5 I:11 */C++?函數調用運算符 () 重載
函數調用運算符 () 可以被重載用于類的對象。當重載 () 時,您不是創造了一種新的調用函數的方式,相反地,這是創建一個可以傳遞任意數目參數的運算符函數。
#include <iostream> using namespace std;class Distance {private:int feet; // 0 到無窮int inches; // 0 到 12public:// 所需的構造函數Distance(){feet = 0;inches = 0;}Distance(int f, int i){feet = f;inches = i;}// 重載函數調用運算符Distance operator()(int a, int b, int c){Distance D;// 進行隨機計算D.feet = a + c + 10;D.inches = b + c + 100 ;return D;}// 顯示距離的方法void displayDistance(){cout << "F: " << feet << " I:" << inches << endl;}}; int main() {Distance D1(11, 10), D2;cout << "First Distance : "; D1.displayDistance();D2 = D1(10, 10, 10); // invoke operator()cout << "Second Distance :"; D2.displayDistance();return 0; }/*輸出結果為 First Distance : F: 11 I:10 Second Distance :F: 30 I:120 */C++?下標運算符 [] 重載
下標操作符 [] 通常用于訪問數組元素。重載該運算符用于增強操作 C++ 數組的功能。
#include <iostream> using namespace std; const int SIZE = 10;class safearay {private:int arr[SIZE];public:safearay() {register int i;for(i = 0; i < SIZE; i++){arr[i] = i;}}int& operator[](int i){if( i > SIZE ){cout << "索引超過最大值" <<endl; // 返回第一個元素return arr[0];}return arr[i];} }; int main() {safearay A;cout << "A[2] 的值為 : " << A[2] <<endl;cout << "A[5] 的值為 : " << A[5]<<endl;cout << "A[12] 的值為 : " << A[12]<<endl;return 0; }/*輸出結果為 A[2] 的值為 : 2 A[5] 的值為 : 5 索引超過最大值 A[12] 的值為 : 0 */部分資料來源于菜鳥教程
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的C++——重载运算符和重载函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++——继承
- 下一篇: s3c2440移植MQTT