C 運算子過載

2021-10-02 19:01:58 字數 3755 閱讀 7428

目錄

運算子過載(operator)

加法運算子過載

類成員函式做運算子過載

全域性函式做運算子過載

前置後置運算子過載

後置運算子 為了和後置運算子做區別,在引數部分有乙個佔位引數

指標運算子過載(智慧型指標) 總結

推薦:c++成員運算子過載和友元運算子過載的比較(以++,--運算子為例)

運算子過載,就是對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別

在c++中,可以定義乙個處理類的新運算子。這種定義很像乙個普通的函式定義,只是函式的名字由關鍵字operator及其緊跟的運算子組成。差別僅此而已。它像任何其他函式一樣也是乙個函式,當編譯器遇到適當的模式時,就會呼叫這個函式。

語法:定義過載的運算子就像定義函式,只是該函式的名字是operator【】

【】是被過載的運算子。函式的引數中引數個數取決於兩個因素。

示例所使用的類宣告及定義如下:

.h

class plus

;

.cpp

plus::plus():

item_one(10)

plus::~plus()

類的物件之間,是沒辦法相互加減運算的,現在寫乙個函式,實現物件之間的加法。

格式:返回值 operator【運算子符合】(形式引數);.h

plus plus::operator +(plus p)

.cpp 

plus p1;

plus p2;

plus p3 = p1 + p2;

//其中p1+p2 等於 p1.operator+(p2);

qdebug()<

輸出:使用運算子過載,實現類物件之間的運算

格式同上:返回值 operator【運算子符合】(形式引數1,形式引數2);

只是因為是全域性函式,沒有this指標的幫助,所以多了乙個形式引數.h

運算子過載,只是某種程度上的函式呼叫

呼叫時也應該注意,對於內建資料型別之間所使用的運算子,是不可能改變的(比如int之間)

格式:返回值 operator【運算子符合】(形式引數);.h

因為不管是後置++還是前置++,都是operator ++,為了區別,後置++多了乙個佔位引數(int)

定義類,類自動釋放new出來的變數

整個過程中,需要過載->h和*兩個運算子

.hclass plus

;

.cpp

plus::plus():

item_one(10)

plus::~plus()

void plus::show()

針對以上類,在進行plus * p = new plus();的時候,

程式設計人員主動在堆區申請了一片空間,需要delete釋放,但是有時候會忘記,所以寫下面乙個類,解決這個問題

.h 

class smartpointer

;

.cpp

smartpointer::smartpointer(plus * p)

smartpointer::~smartpointer()

}

smartpointer類,有乙個私有成員變數,就是p

程式執行如下:

smartpointer test(new plus);
smartpointer物件變數test,在棧區,程式會自動釋放

隱式呼叫建構函式,引數是堆區開闢的一塊記憶體,在smartpointer的構造引數中,這段記憶體的位址會給成員變數p

成員變數一直在,和物件相配套,在此過程中,如建構函式的隱式呼叫,中間在棧區開闢的記憶體都會在函式呼叫結束後釋放

smartpointer物件變數test要被程式自動釋放的時候,自動進入析構函式,在析構函式中,對該物件的成員變數p,進行釋放。

如此,便實現了,自動釋放的要求,但是,通過test,如何訪問plus類的成員函式呢?

我們在類中過載兩個運算子:

.h 

class smartpointer

;

.cpp

plus * smartpointer::operator ->()

plus & smartpointer::operator *()

輸出:

smartpointer test(new plus);

test->show();

(*test).show();

->是指標訪問類成員變數/函式的運算子,所以test->應該變成p指標本身,然後p->show( )

整體效果是test->->show(),編譯器優化了,所以是test->show( )

*test:類本身訪問自己的成員函式和成員變數,this->p是指向類的指標,*(this->p)即可使用「.」訪問

輸出:

第乙個「進入預設建構函式」:是new plus

第二個是建立test

之後是分別進入兩個show()函式;

C 運算子過載 過載特殊運算子

賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...

C 運算子過載賦值運算子

自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...

C 運算子過載轉換運算子

為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...