C++操作符過載總結、字面量運算子

2020-08-12 17:44:13

操作符過載

  1. 基本概念

    ①.過載運算子

    過載的運算子是具有特殊名字的函數:由關鍵字 operator 和其後要定義的運算子號組成,也包括函數返回型別、參數列表及函數體。

    ②.函數參數

    當一個過載運算子是成員函數時,它的左側第一個運算物件系結到 this 指針上,即函數的顯示參數數量比實際少一個。

    ③.過載運算子呼叫

    可以使用普通的運算表達式間接的呼叫過載的運算子,也可以作爲普通函數顯示的呼叫。

    data1+data2;//運算表達式間接呼叫
    data1.operator+(data2);//等價的成員函數呼叫
    
  2. 輸入輸出運算子

    ①.函數構成

    輸入輸出運算子過載函數的第一個形參是一個非 const 的 ostream\istream 物件的參照、第二個參數是要進行操作的物件的參照、函數返回對應的 形參 ostream\istream 物件的參照 。

    ②.非成員函數

    和 標準庫相容的輸入輸出運算子必須是普通的非成員函數,不能是類的成員函數。

    ostream & operator<<(ostream &os,const Sales_data &item)
    {
        os << item.isbin() << endl << item.revenue << endl;
        return os;
    }
    
  3. 算術運算子

    ①.函數構成

    算術運算子過載函數的函數形參通常都是運算物件的 const 參照,函數返回計算後得到新物件的副本。

    ②.非成員函數

    算術運算子和關係運算符通常定義成非成員函數,以允許對左側物件或者右側運算物件進行轉換。

    Sales_data operator+(const Sales_data &item1,const Sales_data &item2)
    {
        Sales_data sum = item1;
        sum.revenue += item2.revenue;
        return sum;
    }
    

    ③.關係運算符

    關係運算符即判斷相等、小於、大於的運算子,一般定義了相等運算子也應該定義對應的不相等運算子。

  4. 賦值運算子

    ①.函數構成:賦值運算子過載函數返回左側運算物件的參照、右側運算物件可以是別的型別。

    ②.成員函數:賦值運算子過載函數一般都定義爲類的成員函數。

    ③.拷貝賦值運算子:右側物件是當前類的另外一個物件的 const 左值參照,需要判斷是否是自身賦值。

    ④.移動賦值運算子:右側運算物件當前類的另外一個物件的非 const 右值參照,需要判斷是否是自身賦值。

    ⑤.列表賦值:函數參數是花括號包含的元素列表

    class StrVec
    {
    public:
        StrVec & operator=(std::initializer_list<std::string>);
    }
    
  5. 下標運算子

    ①.函數構成:表示容器的類通過下標運算子按位元置存取元素,函數返回所存取元素的參照。

    ②.成員函數:下標運算子必須是成員函數

    ③.函數版本:下標運算子通常需要過載兩個版本,即 const 版本和非 const 版本。

    class StrVec
    {
    public:
        string & operator[](std::size_t n){ return elements[n] ;}
        const string & operator[](std::size_t n) const { return elements[n] ; }
    }
    
  6. 函數呼叫運算子

    ①.概念:函數呼叫運輸符即 operator()

    ②.成員函數:函數呼叫運算子必須是成員函數

    struct adsInt
    {
        int operator()(int val) const
        {
            return val < 0 ? -val:val;
        }
    }
    int i = -42;
    absInt obj;
    int ui = obj(i);
    
  7. 型別轉換運算子

    ①.概念:型別轉換運算子一般形式爲:operator type( ) const,負責將一個類型別值轉換成其他型別;不能轉換爲陣列或者函數型別。

    ②.函數構成:型別轉換運算子不能宣告返回值型別,形參列表也必須爲空。

    ③.成員函數:型別轉換運算子必須是成員函數

    class SmallInt
    {
    public:
        SmallInt(int = 0):val(i) {}
        operator int() const { return val;}
    }
    

    ④.拒絕隱式轉換:使用 explicit 關鍵字修飾過載函數,但是當表達式做條件時將會隱身執行。

    class SmallInt
    {
    public:
        SmallInt(int = 0):val(i) {}
        explicit operator int() const { return val;}
    }
    SmallInt si = 3;
    int j = static_cast<int>(si);//顯示轉換
    

字面量操作符

  1. 概念

    ①.字面量運算子:即形如 【operator 「」 後綴 ( )】的運算子函數;其中後綴可以自定義,比如:_C、KG等,建議以下劃線開始;operator ""和使用者自定義後綴直接必須有空格

    ②.字面量運算子過載函數:可以把字面值常數轉換成需要的型別物件;字面量運算子不可以是成員函數。

  2. 字面量型別

    ①.字面量爲整數,*那麼操作符函數只可接受 unsigned long long 或者 const char *作爲參數。

    ②.字面量爲浮點數,操作符函數只可接受 long double 或者 const char* 爲參數。

    ③.字面量爲字串,操作符函數只可接受 const char*,size_t爲參數。

    ④.字面量爲字元,則操作符函數只接受一個 char 爲參數。

  3. 字面量操作符使用

    ①.字串字面量

    使用字面量操作符可以簡化函數參數的輸入,用字面值常數代替使用多個參數構造物件。

在这里插入图片描述

②.整數位面量

除去字串外,後綴宣告也可以作用於數值。

在这里插入图片描述

在这里插入图片描述