C++ operator關鍵字(重載操作符)的用法詳解。本站提示廣大學習愛好者:(C++ operator關鍵字(重載操作符)的用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ operator關鍵字(重載操作符)的用法詳解正文
operator是C++的關鍵字,它和運算符一同運用,表示一個運算符函數,了解時應將operator=全體上視為一個函數名。
這是C++擴展運算符功用的辦法,雖然樣子乖僻,但也可以了解:一方面要使運算符的運用辦法與其原來分歧,另一方面擴展其功用只能經過函數的方式(c++中,“功用”都是由函數完成的)。
一、為什麼運用操作符重載?
關於零碎的一切操作符,普通狀況下,只支持根本數據類型和規范庫中提供的class,關於用戶自己定義的class,假如想支持根本操作,比方比擬大小,判別能否相等,等等,則需求用戶自己來定義關於這個操作符的詳細完成。比方,判別兩團體能否一樣大,我們默許的規則是依照其年齡來比擬,所以,在設計person 這個class的時分,我們需求思索操作符==,而且,依據方才的剖析,比擬的根據應該是age。那麼為什麼叫重載呢?這是由於,在編譯器完成的時分,曾經為我們提供了這個操作符的根本數據類型完成版本,但是如今他的操作數變成了用戶定義的數據類型class,所以,需求用戶自己來提供該參數版本的完成。
二、如何聲明一個重載的操作符?
A: 操作符重載完成為類成員函數
重載的操作符在類體中被聲明,聲明方式好像普通成員函數一樣,只不過他的名字包括關鍵字operator,以及緊跟其後的一個c++預定義的操作符。
可以用如下的方式來聲明一個預定義的==操作符:
class person{ private: int age; public: person(int a){ this->age=a; } inline bool operator == (const person &ps) const; };
完成方式如下:
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作為該函數的一個參數傳遞給該函數,從而完成了兩個對象的比擬。
B:操作符重載完成為非類成員函數(全局函數)
關於全局重載操作符,代表左操作數的參數必需被顯式指定。例如:
#include #include using namespace std; class person { public: int age; public: }; bool operator==(person const &p1 ,person const & p2) //滿足要求,做操作數的類型被顯示指定 { if(p1.age==p2.age) return true; return false; } int main() { person rose; person jack; rose.age=18; jack.age=23; if(rose==jack) cout<<"ok"< return 0; }
C:如何決議把一個操作符重載為類成員函數還是全局名字空間的成員呢?
①假如一個重載操作符是類成員,那麼只要當與他一同運用的左操作數是該類的對象時,該操作符才會被調用。假如該操作符的左操作數必需是其他的類型,則操作符必需被重載為全局名字空間的成員。
②C++要求賦值=,下標[],調用(), 和成員指向-> 操作符必需被定義為類成員操作符。任何把這些操作符定義為名字空間成員的定義都會被標志為編譯時辰錯誤。
③假如有一個操作數是類類型如string類的情形那麼關於對稱操作符比方等於操作符最好定義為全局名字空間成員。
D:重載操作符具有以上限制:
(1)只要C++預定義的操作符集中的操作符才可以被重載;
(2)關於內置類型的操作符,它的預定義不能被改動,應不能為內置類型重載操作符,如,不能改動int型的操作符+的含義;
(3) 也不能為內置的數據類型定義其它的操作符;
(4) 只能重載類類型或枚舉類型的操作符;
(5) 重載操作符不能改動它們的操作符優先級;
(6) 重載操作符不能改動操作數的個數;
(7) 除了對( )操作符外,對其他重載操作符提供缺省實參都是合法的;
E: 留意點
(1)結果載操操作符首先要確定它的前往值是左值,還是右值,假如是左值最前往援用,假如是右值那就直接前往值;
(2) +號等這樣的操作符沒有對象可以包容改動後值,關於這樣的狀況最好前往數值,否則只能要操作符體內創立暫時對象用於包容改動後的值,假如在堆中創立暫時對象前往指針或許援用,在操作符函數體外還需求釋放它,假如前往的對象而不是援用或許指針,那麼效率是比擬低的。假如前往的是數值,最好在該類的結構函數中添加對該類型數值的轉換函數,如:前往值是int類型,那麼最好有一個int類型作為參數的結構函數。
(3)在增量運算符中,放上一個整數形參,就是後增量運轉符,它是值前往,關於前增量沒無形參,而且是援用前往,示例:
class Test { public: Test(x=3){ m_value = x} Test &operator ++(); //前增量 Test &operator ++(int);//後增量 private: Int m_value: }; Test &Test::operator ++() { m_value ++; //先增量 return *this; //前往以後對象 } Test Test::operator ++(int) { Test tmp(*this); //創立暫時對象 m_value ++; //再增量 return temp; //前往暫時對象 }
(4)由於強迫轉換是針對根本數據類型的,所以對類類型的轉換需自定義;
(5) 轉換運轉符重載聲明方式:operator 類型名();它沒有前往類型,由於類型名就代表了它的前往類型,所以前往類型顯得多余。
(6)普通來說,轉換運算符與轉換結構函數(即帶一個參數的結構函數)是互逆的,如有了結構函數Test(int),那麼最好有一個轉換運算符int()。這樣就不用提供對象參數重載運算符了,如Test a1(1);Test a2(2); Test a3; a3 = a1+a2;就不需求重載+號操作符了,由於關於a1+a2的運算,零碎能夠會先找有沒有定義針對Test的+號操作符,假如沒有,它就會找有沒有針對Test類轉換函數參數類型的+號操作符(由於可以將+號運轉後果的類型經過轉換函數轉換為Test對象),由於Test類有個int類型的參數,關於int類型有+操作符,所以a1+a2真正執行的是Test(int(a1) + int(a2));即Test(3);
(7)關於轉換運算符,還有一個需求留意的中央就是,假如A類中有以B為參數的轉換函數(結構函數),那B中不能有A的轉換運算符,不然就存在轉換的二義性,如:
class A{A(B&){…}}; class B{ operator A(){…}};
那麼以下語句就會有問題:
B b; A(b);//A(b)有就能夠是A的結構函數,也可以是B的轉換運算符
以上就是為大家帶來的C++ operator關鍵字(重載操作符)的用法詳解全部內容了,希望大家多多支持~