運算符重載與友元函數

1、概述函數

  C++預約義的運算符的操做對象只能是基本數據類型,可是實際上許多用戶自定義類型(例如類),也須要相似的運算符操做,C++能夠經過運算符重載來知足這種需求。運算符重載本質就是函數重載,也是C++多態的一種形式。運算符重載是經過建立運算符函數實現的,和其餘函數相似,惟一的區別是函數名爲關鍵字operator和運算符符號組成。this

2、運算符重載限制指針

(1)至少有一個操做數是自定義類型,防止爲基本數據類型重載運算符對象

(2)不能違反運算符原來的句法規則,不能修改運算符優先級變量

(3)不能建立新的運算符數據類型

(4)有些運算符不能重載數據

(5)大多數運算符重載能夠經過成員函數或者非成員函數實現,可是有些運算符只能經過成員函數重載,例如賦值運算符=、函數調用運算符()、下標運算符[]、經過指針訪問類成員運算符->類型轉換

3、友元函數co

在類聲明中,友元函數在聲明前添加friend關鍵字,在函數定義中不用再添加friend關鍵字,也不用添加類的限定符,由於友元函數爲非成員函數,可是友元函數能夠訪問類成員變量錯誤

4、運算符重載的兩種方式

一、運算符重載函數爲類的成員函數

(1)函數定義

  <返回值類型> operator <運算符符號>(<形參>)

  {

  }

(2)函數調用

  <對象名>.operator <運算符>(<實參>)

  或者<對象名><運算符><參數>

二、運算符重載函數爲類的友元函數

(1)函數定義

  friend <返回值類型> operator <運算符符號>(<參數類別>)

  {

  }

(2)函數調用

  operator <運算符>(<參數1>,<參數2>)

  或者operator <運算符>(<參數1>,<參數2>)

 5、兩種運算符重載形式比較

一、運算符重載函數爲成員函數時,函數的參數要比原來的操做數少一個,由於成員函數用this指針隱式地訪問了類的一個對象,它充當了運算符函數最左邊的操做數

二、運算符重載函數對於成員函數和友元函數這兩種形式只能選擇一種,不然將產生二義性錯誤

三、當須要重載的運算符具備可交換性時,選擇友元函數

四、當運算符左邊的操做數是不一樣類的對象時,例如cout<<MyClass,則必須採用友元函數來實現。

五、賦值運算符=、函數調用運算符()、下標運算符[]、經過指針訪問類成員運算符->,這些運算符只能採用成員函數進行運算符重載

六、 若運算符所需的操做數(尤爲是第一個操做數)但願有隱式類型轉換,則只能選用友元函數

相關文章
相關標籤/搜索