當呼叫乙個過載函式和過載運算子時,編譯器通過把您所使用的引數型別和定義中的引數型別相比較,巨鼎選用最合適的定義。(過載決策)
過載運算子時帶有特殊名稱的函式,函式名是由關鍵字operator
和其後要過載的運算子符號構成,與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。
返回型別 operator 運算子(引數列表)
大多數的過載運算子可被定義為不同的非成員函式,或者定義為類成員函式。
不可過載的運算子:
輸入輸出運算子過載
首先我們需要對流輸入輸出的原理有乙個簡單的理解。
cin
是istream
類的物件,cout
是ostream
類的物件
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 中運算子的概念十分廣泛,甚至包含 陣列索引 函式呼叫 型別轉換以及記憶體分配和釋放例程。可以通過運算子過載來改變語言運算子對自定義類的行為。能讓自己的類具...