operator是C++的關鍵字,它和運算符一塊兒使用,表示一個運算符函數,理解時應將operator=總體上視爲一個函數名。
這是C++擴展運算符功能的方法,雖然樣子古怪,但也能夠理解:
一方面要使運算符的使用方法與其原來一致,另外一方面擴展其功能只能經過函數的方式(c++中,「功能」都是由函數實現的)。
1、爲何使用操做符重載?
對於系統的全部操做符,通常狀況下,只支持基本數據類型和標準庫中提供的class,對於用戶本身定義的class,若是想支持基本操做,好比比較大小,判斷是否相等,等等,則須要用戶本身來定義關於這個操做符的具體實現。好比,判斷兩我的是否同樣大,咱們默認的規則是按照其年齡來比較,因此,在設計person 這個class的時候,咱們須要考慮操做符==,並且,根據剛纔的分析,比較的依據應該是age。
那麼爲何叫重載呢?這是由於,在編譯器實現的時候,已經爲咱們提供了這個操做符的基本數據類型實現版本,可是如今他的操做數變成了用戶定義的數據類型class,因此,須要用戶本身來提供該參數版本的實現。
2、如何聲明一個重載的操做符?
A: 操做符重載實現爲類成員函數
重載的操做符在類體中被聲明,聲明方式如同普通成員函數同樣,只不過他的名字包含關鍵字operator,以及緊跟其後的一個c++預約義的操做符。
能夠用以下的方式來聲明一個預約義的==操做符:
複製代碼
class person{
private:
int age;
public:
person(int a){
this->age=a;
}
inline bool operator == (const person &ps) const;
};
複製代碼
實現方式以下:ios
inline bool person::operator==(const person &ps) const
{
if (this->age==ps.age)
return true;
return false;
}
調用方式以下:c++
複製代碼
#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:操做符重載實現爲非類成員函數(全局函數)
對於全局重載操做符,表明左操做數的參數必須被顯式指定。例如:
複製代碼
class person
{
public:
int age;
public:
};
bool operator==(person const &p1 ,person const & p2)
//知足要求,作操做數的類型被顯示指定
{
if(p1.age==p2.age)
return true;
return false;
}
複製代碼
調用方式以下:this
複製代碼
int main()
{
person rose;
person jack;
rose.age=18;
jack.age=23;
if(rose==jack)
cout<<"ok"< return 0;
}
複製代碼
spa
C:如何決定把一個操做符重載爲類成員函數仍是全局名字空間的成員呢?
①若是一個重載操做符是類成員,那麼只有當與他一塊兒使用的左操做數是該類的對象時,該操做符纔會被調用。若是該操做符的左操做數必須是其餘的類型,則操做符必須被重載爲全局名字空間的成員。
②C++要求賦值=,下標[],調用(), 和成員指向-> 操做符必須被定義爲類成員操做符。任何把這些操做符定義爲名字空間成員的定義都會被標記爲編譯時刻錯誤。
③若是有一個操做數是類類型如string類的情形那麼對於對稱操做符好比等於操做符最好定義爲全局名字空間成員。
如下是C++ operator重載的例子設計
#include <iostream>
using namespace std;
class A
{
public:
A(double _data = 0.0):data(_data){}
A& operator = (const A& rhs)
{
data = rhs.data;
return *this;
}
friend A operator + (const A& lhs,const A& rhs);
friend A operator - (const A& lhs,const A& rhs);
friend A operator * (const A& lhs,const A& rhs);
friend A operator + (const A& lhs,double rhs);
friend A operator + (double lhs,const A& rhs);
friend A operator * (const A& lhs,double rhs);
friend A operator * (double lhs,const A& rhs);
friend A operator - (const A& lhs,double rhs);
friend A operator - (double lhs,const A& rhs);
friend ostream& operator << (ostream& fout,A& a);
// A& operator += (const A& rhs);
// A& operator -= (const A& rhs);
// A& operator *= (const A& rhs);
private:
double data;
};
A operator + (const A& lhs,const A& rhs)
{
A res(0);
res.data = lhs.data + rhs.data;
return res;
}
A operator - (const A& lhs,const A& rhs)
{
A res(0);
res.data = lhs.data - rhs.data;
return res;
}
A operator * (const A& lhs,const A& rhs)
{
A res(0);
res.data = lhs.data * rhs.data;
return res;
}
A operator + (const A& lhs,double rhs)
{
A res(0);
res.data = lhs.data + rhs;
return res;
}
A operator + (double lhs,const A& rhs)
{
A res(0);
res.data = lhs + rhs.data;
return res;
}
A operator * (const A& lhs,double rhs)
{
A res(0);
res.data = lhs.data * rhs;
return res;
}
A operator * (double lhs,const A& rhs)
{
A res(0);
res.data = lhs * rhs.data;
return res;
}
A operator - (const A& lhs,double rhs)
{
A res(0);
res.data = lhs.data - rhs;
return res;
}
A operator - (double lhs,const A& rhs)
{
A res(0);
res.data = lhs - rhs.data;
return res;
}
ostream& operator << (ostream& fout,A& a)
{
fout << a.data ;
return fout;
}
int main(int argc, char* argv[])
{
A a(2.3);
A b(1.2);
A d(3.4);
A c;
c = a + b + d;
c=a+b;
c=a+1.0;
c=a-b;
c=a-1.0;
c=a*b;
c=a*1.0;
cout << c << endl;
c=1.0+2.0*a*a-3.0*a*b;
cout << c << endl;
return 0;
}對象