天天看點

C++操作符重載實際操作方法解析

我們為什麼要使用C++操作符重載,又該如何正确的聲明一個C++操作符重載呢?我們今天将會為大家詳細介紹一下這兩個方面的具體知識。

AD:

​​C++​​程式設計語言發展至今已經成為了開發領域中一個重要的應用語言。其中有很多比較高深的内容還值得我們在實踐中去不斷的探索。在這裡我們就先從對C++操作符重載的應用方式的了解來進一步解讀這一程式設計語言。

​​C++指針與引用之間有何不同之處​​

​​C++檔案流操作具體實作方法探讨​​

​​C++ enum枚舉代碼示例剖析​​

​​C++動态數組應用方式探讨​​

​​各種C++繼承方式範例分析​​

一、為什麼使用C++操作符重載?

對于系統的所有操作符,一般情況下,隻支援基本資料類型和标準庫中提供的class,對于使用者自己定義的class,如果想支援基本操作,比如比較大小,判斷是否相等,等等,則需要使用者自己來定義關于這個操作符的具體實作。比如,判斷兩個人是否一樣大,我們預設的規則是按照其年齡來比較,是以,在設計person 這個class的時候,我們需要考慮操作符==,而且,根據剛才的分析,比較的依據應該是age。那麼為什麼叫重載呢?這是因為,在編譯器實作的時候,已經為我們提供了這個操作符的基本資料類型實作版本,但是現在他的操作數變成了使用者定義的資料類型class,是以,需要使用者自己來提供該參數版本的實作。

二、如何聲明一個C++操作符重載?

A:操作符重載實作為類成員函數

重載的操作符在類體中被聲明,聲明方式如同普通成員函數一樣,隻不過他的名字包含關鍵字operator,以及緊跟其後的一個c++預定義的操作符。可以用如下的方式來聲明一個預定義的==操作符:

class person{  

private:  

int age;  

 public:  

 person(int a){  

this->aage=a;  

}  

inline bool operator ==(const person &ps) const;  

}; 

C++操作符重載實作方式如下:

inline bool person::operator==(const person &ps) const  

{ if (this->age==ps.age)  

 return true;  

return false;  

調用方式如下:

 #include  

using namespace std;  

int main()  

{ person p1(10);  

person p2(20);  

if(p1==p2) cout<<”the age is equal!”<return 0;   

這裡,因為operator ==是class person的一個成員函數,是以對象p1,p2都可以調用該函數,上面的if語句中,相當于p1調用函數==,把p2作為該函數的一個參數傳遞給該函數,進而實作了兩個對象的比較。

考慮如下的if語句:

if(10==p1) cout<<”the age is equal!”< 

是否回正确執行呢?

答案是不會的,因為隻有左操作數是該類類型的對象的時,才會考慮作為類成員重載操作符。因為10不是person類型的對象,是以,不能調用classperson的操作符==。

考慮如下if語句:

if(person(10)==person(11))  

 cout<<"ok"< 

是否能夠正确執行呢?答案是可以,因為操作符兩邊均是無名對象。重載的操作符并不要求兩個操作數的類型一定相同。例如:我們可以為class person定義下标操作符,以表示該person和電話的對應關系:

  

對于重載為成員函數方式的操作符,隐式的this指針被作為該函數的第一個參數,來代表左操作數。

B:C++操作符重載實作為非類成員函數(全局函數)

對于全局重載操作符,代表左操作數的參數必須被顯式指定。例如:

#include  

class person  

{  

public:  

 int age;  

在類的外部,不能通路該類私有資料,是以,要把age設定為public

bool operator==(person const &p1 ,person const & p2)  

 if(p1.age==p2.age)  

 return false;  

person rose;  

person jack;  

rose.age=18;  

jack.age=23;  

if(rose==jack)/*兩個對象分别代表左右操作數*/   

cout<<"ok"<return 0;  

C:如何決定把一個操作符重載為類成員函數還是全局名字空間的成員呢?

①如果一個重載操作符是類成員,那麼隻有當與他一起使用的左操作數是該類的對象時,該操作符才會被調用。如果該操作符的左操作數必須是其他的類型,則操作符必須被重載為全局名字空間的成員。

②C++要求指派=,下标[],調用(), 和成員指向-> 操作符必須被定義為類成員操作符。任何把這些操作符定義為名字空間成員的定義都會被标記為編譯時刻錯誤。

③如果有一個操作數是類類型如string類的情形那麼對于對稱操作符比如等于操作符最好定義為全局名字空間成員。

D:操作符重載為友元函數方式

如果把C++操作符重載為友元函數方式,則在該函數的内部,可以直接通路授權類的私有資料成員,這是友元函數方式和全局名字空間方式的主要差別。

E:怎樣判斷一個非類成員的操作符應該是類的友元還是應該使用成員通路函數呢?一般來說,類的實作者應該盡量使得名字空間函數和通路類内部表示的操作符的數目最小化。如果已經提供了通路成員函數并且它們具有等同的效率,那麼最好是使用這些成員函數。但是如果類的實作者決定不為該類的某些私有成員提供通路成員函數而且名字空間操作符需要引用這些私有成員才能完成,它們的操作那麼就必須使用友元機制。例如:

public:   

};    

if(p1.age==p2.age) return true;  

ostream operator<<(ostream &os,person const &p)  

os<<"the person age is:"<return os;  

cout</*call ostream operator<<(ostream &os,person const &p) */  

cout<return 0;  

三、C++操作符重載的設計

①類的設計者不能聲明一個沒有預定義的重載操作符。

②不能為内置資料類型定義其他的操作符。

③預定義的操作符優先級不能被改變。

④一個類最終需要提供哪些操作符,是由該類預期的用途來決定的。

四、prefix and postfix

為區分後置操作符與前置操作符的聲明,重載的遞增和遞減後置操作符的聲明有一個額外的int 類型的參數。這裡不需要給出參數名,因為它沒有被用在操作符定義中。額外的整型參數對于後置操作符的使用者是透明的,編譯器為它提供了預設值因而該參數也可以被忽略。例如:

 person(int a)  

 {  

 aage=a;  

 }  

person const operator++()/*prefix ++ */  

 this->age++;  

 return *this;  

person const operator++(int a)/*postfix ++ */  

 person temp(1);  

 temp=*this;  

 return temp;  

int GetAge()  

 return age;  

};  

person rose(10);  

person jack(20);  

person marry(22);  

person tom(30);  

jack=++rose;  

marry= tom++;  

return 0;  

以上就是對C++操作符重載的相關介紹。

繼續閱讀