c++操作符重載

來源:互聯網
上載者:User

一、為什麼使用操作符重載?
對於系統的所有操作符,一般情況下,只支援基礎資料型別 (Elementary Data Type)和標準庫中提供的class,對於使用者自己定義的class,如果想支援基本操作,比如比較大小,判斷是否相等,等等,則需要使用者自己來定義關於這個操作符的具體實現。比如,判斷兩個人是否一樣大,我們預設的規則是按照其年齡來比較,所以,在設計person 這個class的時候,我們需要考慮操作符==,而且,根據剛才的分析,比較的依據應該是age。那麼為什麼叫重載呢?這是因為,在編譯器實現的時候,已經為我們提供了這個操作符的基礎資料型別 (Elementary Data Type)實現版本,但是現在他的運算元變成了使用者定義的資料類型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作為該函數的一個參數傳遞給該函數,從而實現了兩個對象的比較。
考慮如下的if語句:
if(10==p1) cout<<”the age is equal!”<是否回正確執行呢?
答案是不會的,因為只有左運算元是該類類型的對象的時,才會考慮作為類成員重載操作符。因為10不是person類型的對象,所以,不能調用classperson的操作符==。
考慮如下if語句:
if(person(10)==person(11))
cout<<"ok"<是否能夠正確執行呢?答案是可以,因為操作符兩邊均是無名對象。
重載的操作符並不要求兩個運算元的類型一定相同。例如:我們可以為class person定義下標操作符,以表示該person和電話的對應關係:
/*實現下標操作符*/
#include
#include
using namespace std;
class person
{ private:
int tel;
public:
int & operator[](string const & nm)
{
return tel;
}
int GetTel()
{
return tel;
}
};
int main()
{
person p1;
p1["suo"]=110;
person p2;
p2["rose"]=120;
cout<cout<return 0;
}
對於重載為成員函數方式的操作符,隱式的this指標被作為該函數的第一個參數,來代表左運算元。
B:操作符重載實現為非類成員函數(全域函數)
對於全域重載操作符,代表左運算元的參數必須被顯式指定。例如:
#include
#include
using namespace std;
class person
{
public:
int age;
public:
};
/*在類的外部,不能訪問該類私人資料,所以,要把
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:操作符重載為友元函數方式
如果把操作符重載為友元函數方式,則在該函數的內部,可以直接存取授權類的私人資料成員,這是友元函數方式和全域名字空間方式的主要區別。
E:怎樣判斷一個非類成員的操作符應該是類的友元還是應該使用成員訪問函數呢?一般來說,類的實現者應該盡量使得名字空間函數和訪問類內部表示的操作符的數目最小化。如果已經提供了訪問成員函數並且它們具有等同的效率,那麼最好是使用這些成員函數。但是如果類的實現者決定不為該類的某些私人成員提供訪問成員函數而且名字空間操作符需要引用這些私人成員才能完成,它們的操作那麼就必須使用友元機制。
例如:
#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;
}
ostream operator<<(ostream &os,person const &p)
{
os<<"the person age is:"<return os;
}
int main()
{
person rose;
person jack;
rose.age=18;
jack.age=23;
cout</*call ostream operator<<(ostream &os,person const &p) */
cout<return 0;
}
三、重載操作符的設計
①類的設計者不能聲明一個沒有預定義的重載操作符。
②不能為內建資料類型定義其他的操作符。
③預定義的操作符優先順序不能被改變。
④一個類最終需要提供哪些操作符,是由該類預期的用途來決定的。
四、prefix and postfix
為區分後置操作符與前置操作符的聲明,重載的遞增和遞減後置操作符的聲明有一個額外的int 類型的參數。這裡不需要給出參數名,因為它沒有被用在操作符定義中。額外的整型參數對於後置操作符的使用者是透明的,編譯器為它提供了預設值因而該參數也可以被忽略。
例如:
#include
#include
using namespace std;
class person
{
private:
int age;
public:
person(int a)
{
age=a;
}
person const operator++()/*prefix ++ */
{
this->age++;
return *this;
}
person const operator++(int a)/*postfix ++ */
{
person temp(1);
temp=*this;
this->age++;
return temp;
}
int GetAge()
{
return age;
}
};
int main()
{
person rose(10);
person jack(20);
person marry(22);
person tom(30);
jack=++rose;
marry= tom++;
return 0;
}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.