C++——重载运算符和重载函数
重載運(yùn)算符和重載函數(shù)
C++ 中的函數(shù)重載
C++ 中的運(yùn)算符重載
C++?一元運(yùn)算符重載
C++?二元運(yùn)算符重載
C++?關(guān)系運(yùn)算符重載
C++?輸入/輸出運(yùn)算符重載
C++?賦值運(yùn)算符重載
C++?函數(shù)調(diào)用運(yùn)算符 () 重載
C++?下標(biāo)運(yùn)算符 [] 重載
重載運(yùn)算符和重載函數(shù)
C++ 允許在同一作用域中的某個(gè)函數(shù)和運(yùn)算符指定多個(gè)定義,分別稱為函數(shù)重載和運(yùn)算符重載。
重載聲明是指一個(gè)與之前已經(jīng)在該作用域內(nèi)聲明過(guò)的函數(shù)或方法具有相同名稱的聲明,但是它們的參數(shù)列表和定義(實(shí)現(xiàn))不相同。
當(dāng)您調(diào)用一個(gè)重載函數(shù)或重載運(yùn)算符時(shí),編譯器通過(guò)把您所使用的參數(shù)類型與定義中的參數(shù)類型進(jìn)行比較,決定選用最合適的定義。選擇最合適的重載函數(shù)或重載運(yùn)算符的過(guò)程,稱為重載決策。
C++ 中的函數(shù)重載
在同一個(gè)作用域內(nèi),可以聲明幾個(gè)功能類似的同名函數(shù),但是這些同名函數(shù)的形式參數(shù)(指參數(shù)的個(gè)數(shù)、類型或者順序)必須不同。不能僅通過(guò)返回類型的不同來(lái)重載函數(shù)。
#include <iostream>using namespace std;class PutData { public:void Put_Data(int num){cout <<"整數(shù)為: "<< num << endl ;}void Put_Data(double fl){cout <<"浮點(diǎn)數(shù)為: " << 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'); }/*輸出結(jié)果為 整數(shù)為: 5 浮點(diǎn)數(shù)為: 6.6 字符為: c */C++ 中的運(yùn)算符重載
您可以重定義或重載大部分 C++ 內(nèi)置的運(yùn)算符。這樣,您就能使用自定義類型的運(yùn)算符。
重載的運(yùn)算符是帶有特殊名稱的函數(shù),函數(shù)名是由關(guān)鍵字 operator 和其后要重載的運(yùn)算符符號(hào)構(gòu)成的。與其他函數(shù)一樣,重載運(yùn)算符有一個(gè)返回類型和一個(gè)參數(shù)列表。
Box operator+(const Box&);聲明加法運(yùn)算符用于把兩個(gè) Box 對(duì)象相加,返回最終的 Box 對(duì)象。大多數(shù)的重載運(yùn)算符可被定義為普通的非成員函數(shù)或者被定義為類成員函數(shù)。如果我們定義上面的函數(shù)為類的非成員函數(shù),那么我們需要為每次操作傳遞兩個(gè)參數(shù),如下所示:
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 的長(zhǎng)度是" << line3.Get_Lenth() << endl ; }/*輸出結(jié)果為 Line3 的長(zhǎng)度是15 */C++?一元運(yùn)算符重載
一元運(yùn)算符只對(duì)一個(gè)操作數(shù)進(jìn)行操作,下面是一元運(yùn)算符的實(shí)例:
- 遞增運(yùn)算符( ++ )和遞減運(yùn)算符( -- )
- 一元減運(yùn)算符,即負(fù)號(hào)( - )
- 邏輯非運(yùn)算符( ! )
一元運(yùn)算符通常出現(xiàn)在它們所操作的對(duì)象的左邊,比如 !obj、-obj 和 ++obj,但有時(shí)它們也可以作為后綴,比如 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(); }/*輸出結(jié)果為 creat a object Dis1 is 10 Dis2 is 20 creat a object Dis1 is -10 Dis2 is -20 */C++?二元運(yùn)算符重載
二元運(yùn)算符需要兩個(gè)參數(shù),下面是二元運(yùn)算符的實(shí)例。我們平常使用的加運(yùn)算符( + )、減運(yùn)算符( - )、乘運(yùn)算符( * )和除運(yùn)算符( / )都屬于二元運(yùn)算符。就像加(+)運(yùn)算符。
#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(); }/*輸出結(jié)果為 creat a object creat a object creat a object creat a object Dis1 is 5 Dis2 is 15 */C++?關(guān)系運(yùn)算符重載
C++ 語(yǔ)言支持各種關(guān)系運(yùn)算符( < 、 > 、 <= 、 >= 、 == 等等),它們可用于比較 C++ 內(nèi)置的數(shù)據(jù)類型。
您可以重載任何一個(gè)關(guān)系運(yùn)算符,重載后的關(guān)系運(yùn)算符可用于比較類的對(duì)象。
#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 ;} }/*輸出結(jié)果為 creat a object creat a object d2 小 */C++?輸入/輸出運(yùn)算符重載
C++ 能夠使用流提取運(yùn)算符 >> 和流插入運(yùn)算符 << 來(lái)輸入和輸出內(nèi)置的數(shù)據(jù)類型。您可以重載流提取運(yùn)算符和流插入運(yùn)算符來(lái)操作對(duì)象等用戶自定義的數(shù)據(jù)類型。
在這里,有一點(diǎn)很重要,我們需要把運(yùn)算符重載函數(shù)聲明為類的友元函數(shù),這樣我們就能不用創(chuàng)建對(duì)象而直接調(diào)用函數(shù)。
#include <iostream> using namespace std;class Distance {private:int feet; // 0 到無(wú)窮int inches; // 0 到 12public:// 所需的構(gòu)造函數(shù)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; }/*輸出結(jié)果為 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++?賦值運(yùn)算符重載
就像其他運(yùn)算符一樣,您可以重載賦值運(yùn)算符( = ),用于創(chuàng)建一個(gè)對(duì)象,比如拷貝構(gòu)造函數(shù)。
#include <iostream> using namespace std;class Distance {private:int feet; // 0 到無(wú)窮int inches; // 0 到 12public:// 所需的構(gòu)造函數(shù)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();// 使用賦值運(yùn)算符D1 = D2;cout << "First Distance :"; D1.displayDistance();return 0; }/*輸出結(jié)果為 First Distance : F: 11 I:10 Second Distance :F: 5 I:11 First Distance :F: 5 I:11 */C++?函數(shù)調(diào)用運(yùn)算符 () 重載
函數(shù)調(diào)用運(yùn)算符 () 可以被重載用于類的對(duì)象。當(dāng)重載 () 時(shí),您不是創(chuàng)造了一種新的調(diào)用函數(shù)的方式,相反地,這是創(chuàng)建一個(gè)可以傳遞任意數(shù)目參數(shù)的運(yùn)算符函數(shù)。
#include <iostream> using namespace std;class Distance {private:int feet; // 0 到無(wú)窮int inches; // 0 到 12public:// 所需的構(gòu)造函數(shù)Distance(){feet = 0;inches = 0;}Distance(int f, int i){feet = f;inches = i;}// 重載函數(shù)調(diào)用運(yùn)算符Distance operator()(int a, int b, int c){Distance D;// 進(jìn)行隨機(jī)計(jì)算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; }/*輸出結(jié)果為 First Distance : F: 11 I:10 Second Distance :F: 30 I:120 */C++?下標(biāo)運(yùn)算符 [] 重載
下標(biāo)操作符 [] 通常用于訪問(wèn)數(shù)組元素。重載該運(yùn)算符用于增強(qiáng)操作 C++ 數(shù)組的功能。
#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 << "索引超過(guò)最大值" <<endl; // 返回第一個(gè)元素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; }/*輸出結(jié)果為 A[2] 的值為 : 2 A[5] 的值為 : 5 索引超過(guò)最大值 A[12] 的值為 : 0 */部分資料來(lái)源于菜鳥(niǎo)教程
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的C++——重载运算符和重载函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++——继承
- 下一篇: QT绘图控件QWT的安装及配置