C 學習筆記四 運算子過載

2021-10-01 05:43:25 字數 2991 閱讀 4300

當呼叫乙個過載函式和過載運算子時,編譯器通過把您所使用的引數型別和定義中的引數型別相比較,巨鼎選用最合適的定義。(過載決策)

過載運算子時帶有特殊名稱的函式,函式名是由關鍵字operator和其後要過載的運算子符號構成,與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。

返回型別 operator 運算子(引數列表)

大多數的過載運算子可被定義為不同的非成員函式,或者定義為類成員函式。

不可過載的運算子:

輸入輸出運算子過載

首先我們需要對流輸入輸出的原理有乙個簡單的理解。

cinistream類的物件,coutostream類的物件

cin>>x;相當於cin.operator>>x;然後會在輸入緩衝區中讀入整型資料後返回流輸入物件cin,方便以後再次輸入。

我們可以傳統的寫法進行運算子過載:

例如:

#include

using

namespace std;

class

distance

distance

(int f,

int i)

ostream&

operator

<<

(ostream& os)};

intmain()

執行結果:

這樣寫雖然可以但是不太符合我們的習慣,我們更習慣將cout放到最左邊。為了能夠適用這種寫法,我們需要使用友元函式。

詳見**:

#include

using

namespace std;

class

distance

distance

(int f,

int i)

friend ostream&

operator

<<

(ostream& os,

const distance& x)};

intmain()

這樣寫起來就顯得很自然。這裡我們通過友元函式進行過載。因為《是二元操作符的緣故我們需要兩個引數。其他操作符也可以使用友元函式進行過載,只需要將操作物件放到引數列表中即可。

自增自減運算子的過載

因為自增自減運算子有字首和字尾之分,因此在過載時也有所不同。除去實現上的不同,字尾運算子在過載的時候引數列表需要有乙個int,來向編譯器說明這是乙個字尾形式。例如:

返回型別 operator++(

int)

自增和自減運算子一般是改變物件的狀態,所以一般是過載為成員函式。

在實際實現的時候,對於字首運算子我們直接改變成員的狀態然後返回乙個相同的成員。對於字尾運算子我們先建立乙個物件儲存物件的值,然後進行改變,最後返回原來的值。

例如:

#include

using

namespace std;

class

time

time

(int h,

int m)

// 顯示時間的方法

void

displaytime()

// 過載字首遞增運算子( ++ )

time operator++(

)return

time

(hours, minutes);}

// 過載字尾遞增運算子( ++ )

time operator++(

int)

// 返回舊的原始值

return t;}}

;int

main()

賦值運算子過載

詳見例項:

#include

using

namespace std;

class

distance

distance

(int f,

int i)

void

operator=(

const distance &d )

// 顯示距離的方法

void

displaydistance()

};intmain()

函式呼叫運算子()過載

過載函式的引數列表就是()應該加上的內容

#include

using

namespace std;

class

distance

distance

(int f,

int i)

// 過載函式呼叫運算子

distance operator()

(int a,

int b,

int c)

// 顯示距離的方法

void

displaydistance()

};intmain()

下標運算子過載

同樣的,過載函式的引數列表應該和中的內容相同。

類成員訪問運算子->過載

成員訪問運算子可以被過載,只是比較麻煩。它被定義為為乙個類賦予指標行為。

類成員訪問運算子->通常與指標引用運算子*結合使用。用於實現「智慧型指標」的功能。這些指標可以自動執行一些操作,如在刪除指標的時候同時析構物件等來防止一些記憶體洩漏的問題。

c 學習筆記 運算子過載

今天在看使用ceres擬合函式 的時候看到了運算子過載,由於c 當時沒學好現在也忘得差不多了,所以打算開始做乙個c 的學習筆記,看到哪寫到哪。今天看到的這段 如下 template bool operator const t const abc,t residual const 操作符過載的格式是 ...

C 學習筆記 運算子過載

自定義類可以過載運算子,大多數的運算子都是可以過載的,下表給出了那些運算子可以過載那些不可以過載。對於運算子的過載,我們需要明白運算子是如何呼叫的。非成員函式的運算子呼叫 d1 d2 表示式方式呼叫 operator d1,d2 等價的呼叫 成員函式的運算子呼叫方式 d1 d2 運算子呼叫 d1.o...

C 運算子過載(四)

c 允許在自己的類中,或是在全域性作用域中重定義運算子的含義。由於很多物件導向的語言沒有提供這種能力,因此你可能會低估這種特性在c 中的作用。c 中運算子的概念十分廣泛,甚至包含 陣列索引 函式呼叫 型別轉換以及記憶體分配和釋放例程。可以通過運算子過載來改變語言運算子對自定義類的行為。能讓自己的類具...