自定義類可以過載運算子,大多數的運算子都是可以過載的,下表給出了那些運算子可以過載那些不可以過載。
對於運算子的過載,我們需要明白運算子是如何呼叫的。
//非成員函式的運算子呼叫
d1+d2;
//表示式方式呼叫
operator+
(d1,d2)
;//等價的呼叫
//成員函式的運算子呼叫方式
d1+=d2;
//運算子呼叫
d1.operator+
=(d2)
;//等價的呼叫
成員函式和非成員函式的選擇在《c++primer》中有以下準則:
io操作中分別用"<>"兩個符號表示輸出和輸入,過載時返回io物件的引用。
過載輸出運算子<<
過載輸入運算子》
輸入輸出運算子必須是非成員函式,否則在呼叫時左側必須是乙個類的物件,為了能夠訪問私有成員,類需要將過載函式宣告為友元函式。
案例:
#include
#include
#include
using namespace std;
class person
person()
:name
(" "),
age(0)
,***(""
)private:
string name;
int age;
string ***;};
ostream& operator<<
(ostream& os,
const person& p)
istream& operator>>
(istream &is,person &p)
return is;
}int
main()
對於輸入運算子中的錯誤檢查我們可以更加完善的表示錯誤,具體如何操作參考文章:io操作
通常情況下我們把算術和關係運算子定義成非成員函式以允許對左側或者右側的運算物件進行轉換,關係運算子一般不需要改變運算物件的狀態,所以形參都是常量的引用。
案例:
bool operator ==
(const person& p1,
const person& p2)
bool operator<
(const person &p1,
const person &p2)
bool operator>
(const person& p1,
const person& p2)
賦值運算子的過載包含兩種版本,乙個是拷貝賦值運算子,另乙個是移動賦值運算子。
拷貝賦值運算子參考:拷貝賦值運算子
移動賦值運算子:移動賦值
5.自增自減運算子(++、- -)
自增自減操作一般定義為類的成員函式,因為遞增遞減操作改變了類的內部狀態,一般需要定義成為成員函式。遞增遞減操作需要考慮兩種情形,一種是前置的、另一種是後置的。
前置版本
person& operator++()
後置版本的遞增遞減運算子為了和前置版本的進行區別,在引數列表中加入int關鍵字加以區別。
person& operator++
(int
)
所謂函式物件就是函式過載了函式呼叫運算子"()",當某個類過載了函式呼叫運算子我們可以象呼叫函式一樣的方式呼叫該類的物件。呼叫運算子必須是成員函式,乙個類可以定義多個不同版本的呼叫運算子,相互之間應該在引數數量或者型別上有所區別。
class test
void
operator()
(string s1)
private:
string s;};
test t
("hello");
t(" world"
);
上述物件的呼叫將會列印hello world
標準庫定義的函式物件:
c++語言中有很多種可呼叫物件:函式、函式針針、lambda表示式、bind物件等。在在不同的可呼叫函式中可以有相同的呼叫形式,一般呼叫形式為:type (typea,typeb)
,如add函式和sub函式都有相同呼叫形式int(int,int)。
function是一種函式模板,用function宣告的呼叫形式可以接收所有的據相同的呼叫形式的可呼叫物件;
int
add(
int v1,
int v2)
class add};
function<
int(
int,
int)
> f1 = add;
//函式指標
function<
int(
int,
int)
> f2 =
add();
//函式物件類
function<
int(
int,
int)
> f3 =
(int v1,
int v2)
//lambda表示式
;cout <
5,5)
<< endl;
cout <
5,5)
<< endl;
cout <
5,5)
<< endl;
c 學習筆記 運算子過載
今天在看使用ceres擬合函式 的時候看到了運算子過載,由於c 當時沒學好現在也忘得差不多了,所以打算開始做乙個c 的學習筆記,看到哪寫到哪。今天看到的這段 如下 template bool operator const t const abc,t residual const 操作符過載的格式是 ...
運算子過載學習筆記
定義乙個複數類complex,使之能用於複數的加法運算。編寫程式,求兩複試之和。ifndef complex h define complex h class complex endif include include complex.h complex complex complex comple...
c 運算子過載筆記
1.運算子過載的六個注意事項 1 過載運算子函式的引數個數,應該與參與這個運算子的運算物件數量一樣多,但是如果是成員函式,則引數數量要少乙個,因為第乙個引數是this。例如 includeusing namespace std class test int operator const test v...