【轉】C++ operator兩種用法
C++,有時它的確是個耐玩的東東,就比如operator,它有兩種用法,一種是operator overloading(操作符重載),一種是operator casting(操作隱式轉換)。
1、操作符重載
C++可以通過operator實現重載操作符,格式如下:類型T operator 操作符 (),比如重載+,比如下面這個例子
template<typename T> class A
{
public:
const T operator+(const T& rhs)
{
return this->m _ + rhs;
}
private:
T m _;
};
又比如STL中的函數對象,重載(),比如下面這個例子
template<typename T> struct A
{
T operator()(const T& lhs, const T& rhs){ return lhs-rhs; }
};
2、 操作隱式轉換
C++可以通過operator實現重載隱式轉換,格式如下: operator T (),其中T是一個類型,比如下面這個例子
class A
{
public:
operator B*() { return this->b _; }
operator const B*() { return this->b _; }
operator B&() { return *this->b _; }
private:
B* b _;
};
A a;
當if(a),編譯時,它轉換成if(a.operator B*()),其實也就是相當於 if(a.b _)
1、操作符重載
C++可以通過operator實現重載操作符,格式如下:類型T operator 操作符 (),比如重載+,比如下面這個例子
template<typename T> class A
{
public:
const T operator+(const T& rhs)
{
return this->m _ + rhs;
}
private:
T m _;
};
又比如STL中的函數對象,重載(),比如下面這個例子
template<typename T> struct A
{
T operator()(const T& lhs, const T& rhs){ return lhs-rhs; }
};
2、 操作隱式轉換
C++可以通過operator實現重載隱式轉換,格式如下: operator T (),其中T是一個類型,比如下面這個例子
class A
{
public:
operator B*() { return this->b _; }
operator const B*() { return this->b _; }
operator B&() { return *this->b _; }
private:
B* b _;
};
A a;
當if(a),編譯時,它轉換成if(a.operator B*()),其實也就是相當於 if(a.b _)
C++ 中operator用法:隱式類型轉換
C++中的operator主要有兩個作用,一是操作符的重載,一是操作符的轉換。對於操作符的重載,許多人都不陌生,用以下這個小例子溫故一下:
- class A
- {
- public:
- A operator +(A& oa){A a;a.num=oa.num+num;return a;}
- int num;
- };
- int main(int argc,char* argv[])
- {
- A a; a.num=1;
- A b; b.num=2;
- A c;
- c=a+b;
- cout<<"c.num: "<<c.num<<endl;
- }
- 程序輸出為:c.num: 3;
語法很簡單,在類的成員函數聲明部分作出聲明即可:
- class A {
- public:
- ......
- operator int(){return num;}; // 在需要情況下, A對象可以轉成int類型對象。
- ......
- int num;
- };
- cout<<c+12<<endl; //其中c是A類型的對象
又發生了隱式的類型轉換,這一次,我們可以直接用類的對象去生成一個其他的類型,是不是想到了構造函數的隱式類型轉換部分呢?下面我們就來做一個小小的總結:
構造函數的隱式類型轉換部分,使用一個其他的類型構造當前類的臨時對象,這種轉換必須有構造函數的支持;operator算子的隱式類型轉換,使用當前對象去生成另一個類型的對象(正好與構造函數型相反),這種轉換必須有operator算子的支持。
隱式的類型轉換有利有弊,類的設計者就起決定性作用了,如果你不想讓構造函數發生隱式的類型轉換,請在構造函數前加explicit關鍵字;同時,operator算子聲明的隱式類型轉換也可以通過一些相應的返回值函數替代,用戶的掌控性更好。
建議參考閱讀本博客隱式類類型轉換一文。