運算子過載

2021-09-08 20:56:46 字數 3284 閱讀 8416

在c++中我們可以使用

int a=10;

int b=20;

int c=a+b;

我們知道int型別相加即為將變數中的值相加,a+b=30;

這是由於編譯器編譯系統在內部過載了內建型別的加法運算,這種過載的實質是函式過載,即int operator+(int,int)但是編譯系統只能對內建的型別進行函式過載。

那麼如果變數的型別是類型別呢?

如:

#includeusing namespace std;

class cint

private:

int ma;

};int main()

在上面的**中,我們也要想實現類似int型別的相加,將物件a和物件b的成員變數相加。

編譯器的過載只能對系統定義的基本資料型別起作用,對使用者自己定義的資料型別無法提供相應的運算子過載形式。

這就必須我們手動實現這個函式,相當於對'+'號進行了重定義,實現cint物件之間的相加。

運算子過載的方式就是定義乙個函式,在函式體內實現想要的功能,當用到該運算子時,編譯器就會自動呼叫這個函式。也就是說,運算子過載就是通過函式定義實現的,它本質上是函式過載。

運算子過載規則

1. 不可以過載的運算子

長度運算子(sizeof)、條件運算子(: ?)、成員選擇符(.)、物件選擇符(.*)、域解析符(::)、建構函式的成員初始化器(:)不能被過載

1. 不可以過載的運算子

.* ::  ?:  sizeof

2.過載運算子的限制

不改變運算子的優先順序

不改變運算子的結合性

不改變運算子所需要的運算元

不能建立新的運算子

3.運算子過載的語法形式

運算子函式定義的一般格式如下: 

《返回型別說明符》 operator 《過載的運算子符號》(《參數列》) 

運算子過載為成員函式

我們實現cint類的'+' 運算子過載函式

cint operator+(const cint rhs)

在上面的函式我們可以看出'+'需要兩個運算元,但是由於類的成員函式中預設的this指標,系統預設將左運算元作為預設引數傳遞給this指標,所以我們只需要在形參列表中將右運算元傳入。

我們知道在c語言中有前置++和後置++,按照運算子過載函式的定義都為 operator++();

為了區別這個函式是前置++還是後置++,我們在後置++的形參列表中新增乙個整型引數加以區別,並無其他含義

前置++運算子過載函式

const cint operator++(int)

後置++運算子過載函式

cint& operator++()

在上面我們知道系統預設將雙目運算子的左運算元傳遞給this指標,那麼在過載運算子時

例如:

cint arr = ;

int len = sizeof(arr) / sizeof(arr[0]);

for (cint i = 0;i < len; i++)

我們知道在arr[i]這個關係中,arr是左運算元,i是右運算元,按照規則我們將arr傳遞給this指標,可是arr並不是乙個物件,

這個**就會出現問題。

為了實現運算子的過載,我們在過載是將右運算元傳遞給this指標,而將左運算元通過形參帶入

因為arr[i]=*(arr+i)=*(i+arr)=i[arr]

例如:

int& operator(int* arr)

當然我們也可以過載int 

例如:

operator int()

該函式的返回值型別就是函式名,所以不用顯式地表示出。

什麼叫返回型別就是函式名?

返回型別是int,函式名也是int,就是說不寫成 int operator int()  ,

返回型別被省去了。

operator int() 是型別轉換運算子,目的是把cint型別的物件轉換成int型別

在呼叫arr[i]時會呼叫arr[i.operatoe int()],此時i就已經轉換成int型別,arr[i]也就可以編譯通過

運算子過載為友員函式

友元函式宣告 friend +函式原型

友員是單向的

例如:函式a是cint類的友元函式,函式a中可以訪問cint類中的私有成員變數,但cint類不能訪問函式a中的變數。

不存在傳遞關係

例如:函式a是cint類的友元函式,cint類又是cdouble類的友員,但函式a與cdouble類之間不存在友員關係。

例如:int a;

cin>>a;

cout《如果a的型別是cint型別呢?

那我們必須過載'>>','<<'運算子

《運算子的過載函式

ostream& operator<<(ostream& out, const cint& rhs)

《運算子的過載函式

istream& operator>>(istream& in, cint& rhs)

說明幾點:

1.第乙個形參為對ostream、istream物件的引用,在該物件上將產生輸出,輸入,ostream為非const,因為寫入到流會改變流的狀態;該形參是乙個引用,因為不能複製ostream、istream物件(在c++中定義的標準輸入輸出流類istream和ostream,其中拷貝建構函式和賦值操作符函式都被放置在了private部分,且只有宣告,沒有定義)。

2.第二個形參一般應是對要輸出的類型別的引用,該形參是乙個引用以避免複製實參,減少一次拷貝。

3.返回型別是乙個ostream、istream引用,它的值通常是輸出操作符所操作的ostream、istream物件,首先因為ostream、istream物件不能複製,所以必須是引用;其次引用可以少一次拷貝,提高效率;最後,為了體現連續性,實現連續輸出,達到用多個輸出、輸入操作符操作乙個ostream、istream物件的效果,如果不是引用,程式返回的時候就會生成新的臨時物件,也就是說,連續的兩個《操作符實際上是針對不同物件的,這就好比cout<>a>>b 與cin>>a; cin>>b;的區別。

運算子過載之過載型別運算子

普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...

運算子過載 賦值運算子的過載

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...

運算子過載

c 中的運算子 1。大多數系統預定義運算子都能過載 不值得過載 不能被過載 2過載不能改變優先順序 不能改變結合性 不能改變運算子所需運算元的個數 過載後,可按這些運算子的表達方式使用 運算子過載的語法 一 通過運算子過載函式進行過載 1。運算子過載函式是成員函式 語法形式 type x opera...