天天看點

operator的兩種用法C++ operator兩種用法[C++ 中operator用法:隐式類型轉換]

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**_**)

[C++ 中operator用法:隐式類型轉換]

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;  
 }  
           
  1. 程式輸出為:c.num: 3;

很簡單,也很容易了解。下面有必要系統說下operator算子的另一大功能

操作符的轉換

:operator T

文法很簡單,在類的成員函數聲明部分作出聲明即可:

class A {  
 public:  
    ......  
    operator int(){return num;};  // 在需要情況下, A對象可以轉成int類型對象。  
    ......  
    int num;  
  };  
           

這條聲明使得以下語句成立:

  1. cout<<c+12<<endl; //其中c是A類型的對象

又發生了隐式的類型轉換,這一次,我們可以直接用類的對象去生成一個其他的類型,是不是想到了構造函數的隐式類型轉換部分呢?下面我們就來做一個小小的總結:

構造函數的隐式類型轉換部分,使用一個其他的類型構造目前類的臨時對象,這種轉換必須有構造函數的支援;operator算子的隐式類型轉換,使用目前對象去生成另一個類型的對象(正好與構造函數型相反),這種轉換必須有operator算子的支援。

隐式的類型轉換有利有弊,類的設計者就起決定性作用了,如果你不想讓構造函數發生隐式的類型轉換,請在構造函數前加explicit關鍵字;同時,operator算子聲明的隐式類型轉換也可以通過一些相應的傳回值函數替代,使用者的掌控性更好。

建議參考閱讀部落格隐式類類型轉換一文。

繼續閱讀