c++ 重載運算與類型轉換

1. 基礎概念ios

重載的運算符是具備特殊名字的函數:(重載運算符函數,運算符函數。重載運算符)函數

依次包含返回類型,函數名(operator=),參數列表,函數體。this

只有重載的函數調用運算符operator()纔能有默認實參。spa

關於參數的數量,通常來講,一元運算符有一個參數,二元有兩個,三元有三個;指針

可是若是該運算符函數是成員函數,則其中一個運算對象將是本類對象,第一個參數隱式綁定到this常量指針上,不顯示在參數列表中。成員運算符函數的參數數量比運算符對象少一個。code

  HasPtr& operator=(const HasPtr& right){
    mString = right.mString;
    return *this;
  }

運算符函數要麼是一個類類型的成員函數,要麼它必有類類型的參數。這是由於不能重載內置類型之間的運算(能夠重載類類型與類類型之間的運算,類類型和內置類型之間的運算)。對象

不能本身發明運算符,不能改變運算符的優先級,也不能改變運算符原始運算對象的個數,例如&運算符能夠用於一元運算,也能夠用於二元運算,則根據參數數量判斷是一元仍是二元,可是!操做符永遠不可能重載爲二元運算符。blog

2. 一個例子string

能夠先看一個簡單的例子,重載了類類型Data的 "+" 二元運算符,該運算符函數不是成員函數,所以,參數爲兩個類類型,返回的是類類型中string成員的拼接版(中間加入--)io

#include <iostream>
#include <string>

using namespace std;

class Data{
public:
  Data(){}
  Data(string str){
    this->str = str;
  }
  string str;
};

string operator+(const Data& data1, const Data& data2){
  string str = data1.str + " -- " + data2.str;
  return str;
}

int main(){
  Data data1("hello"), data2("slam"), data3("!!!");
  cout << data1+data2+data3 << endl;
}

輸出:

hello -- slam -- !!!

若但願將操做符函數定義爲Data類的成員函數,則須要改動以下:

#include <iostream>
#include <string>

using namespace std;

class Data{
public:
  Data(){}
  Data(string str){
    this->str = str;
  }
  string str;
  Data operator+(const Data& data);
};

// 只有將返回值定義爲Data類型,表達式才能使用連續運算的形式data1+data2+data3
Data Data::operator+(const Data& data){
  str = str + " -- " + data.str;
  return *this;
}

int main(){
  Data data1("hello"), data2("slam"), data3("!!!");
  cout << (data1+data2+data3).str << endl;
}

輸出結果相同。

注意在第一個例子中(非成員函數)

data1+data2 等價於 operator+(data1, data2)

第二個例子中(成員函數調用)

data1+data2 等價於 data1.operator+(data2)

 

3. 經常使用重載運算符

1) 輸入輸出運算符 << >>

2) 算數和關係運算符 == != <

3) 賦值運算符 = 

4) 下標運算符 []

5) 遞增和遞減運算符 ++ --

6) 成員訪問運算符 * ->

7) 函數調用運算符 () 

相關文章
相關標籤/搜索