關於運算子過載的總結

2021-10-23 08:14:31 字數 3244 閱讀 5239

在講運算子過載之前,先補充一下友元的知識

類可以允許其他類或者函式訪問它的非公有成員,方法是令其他類或者函式成為他的友元(friend)。如果類想把乙個函式作為他的友元,只需要增加一條以friend關鍵字開始的函式宣告語句即可

友元宣告只能出現在類定義的內部,但是在類內出現的具體位置不限,不是類的成員也不受他所在的區域訪問控制級別的約束。

一般來說,最好在類定義開始或者結束前的位置集中宣告友元

友元的宣告僅僅指定了訪問的許可權,而非乙個通常意義上的函式的宣告。如果我們希望類的使用者能夠呼叫某個友元函式,那麼我們必須在友元宣告之外,再專門對函式進行一次宣告。

友元與普通函式的區別在於,友元可以直接訪問類的私有成員,而普通函式只能通過類的公有成員訪問其私有成員

對於乙個運算子函式來說,它或者是類的成員,或者至少含有乙個類型別的引數

我們可以過載大多數(但不是全部)運算子,只能過載已有的運算子,而無權發明新的運算子

當乙個過載的運算子是成員函式時,this繫結到左側運算物件。成員運算子函式的(顯式)引數數量比運算物件的數量少乙個

a @ b;

a.operator@(b);

operator@(a,b);

line1 是隱式呼叫形式

line2、3是顯式呼叫形式

第一種形式是@被過載為類的非靜態成員函式的解釋方式,這種方式要求運算子@左邊的引數必須是乙個物件,operator@是該物件的成員函式

第二種形式是@作為類的友元或普通過載函式時的解釋方式

以非靜態成員函式的方式過載二元運算子時,只能夠有乙個引數,它實際上是函式的第二個引數(即運算子右邊的運算元)。其第乙個引數(運算子左邊的運算元)由c++通過this指標隱式傳遞,而作為普通函式和類的友元函式過載時需要兩個引數。

呼叫類的過載運算子時,作為類成員函式運算子的左引數必須是乙個類物件,而作為友元或普通函式過載的運算子則無此限制。

2-2-1. 過載二元運算子為非靜態成員函式的形式如下:
class x				//其中x *this形參由編譯器自動新增

};

其中,t1是運算子函式的返回型別,t2是引數的型別,原則上t1、t2可以是任何資料型別,而實際上它們常與x相同

2-2-2. 過載二元運算子為類的友元函式或普通函式時需要兩個引數,其形式如下:

class x;

t1 operator(t2 a,t3 b) //友元函式定義

t1 operator(t2 a,t3 b) //普通函式

t1、t2、t3可以是不同的資料型別,但他們通常都是類x。

友元與一般函式過載的區別是:友元可以訪問類的任何資料成員,而普通函式只能訪問類的public成員

(這裡不全說了,只說一下jerry今天委託我講的幾個吧)

3-1-1. 輸入運算子

這裡直接給出固定格式

ostream &operator << (ostream &os , const t1 a)

通常,輸出運算子應該主要負責列印物件的內容而非控制格式,輸出運算子不應該列印換行符

3-1-2. 輸入運算子

這裡先給出**

istream &operator >> (istream &is  , const t1 & a)

3-1-3. 需要注意的問題

輸入輸出運算子必須是非成員函式

輸入運算子必須處理輸入可能失敗的情況(如果輸入失敗,就將給定的物件預設為空或者其他,這樣可以保證物件處於正確的狀態),而輸出運算子不需要

一般來說這個過載後是判斷是否相等或者其他關係的,所以返回值是true或false

所以一般用bool型來定義

在迭代器類中通常會實現遞增運算子( ++ )和遞減運算子( – ),這兩種運算子使得類可以在元素的序列中前後移動。c++語言並不要求遞增和遞減運算子必須是類的成員。但是因為他們改變的正好是所操作物件的狀態,所以建議將其設定為成員函式

對於內建型別來說,遞增和遞減運算子具有前置版本也有後置版本,同樣我們也應該為類定義兩個版本的遞增和遞減運算子,接下來我們首先介紹前置版本。然後實現後置版本。

4-2-1. 定義前置遞增/遞減運算子

舉例說明

class  point
point& point :: operator++()

為了與內建版本保持一致,前置運算子應該返回遞增或遞減後物件的引用

4-2-2. 區分前置和後置運算子

由於普通的過載形式無法區分這兩種情況。前置版本和後置版本用的是同乙個符號,意味著其過載版本所用的名字將是相同的,並且運算物件的數量和型別也相同。

為了解決這一問題,後置版本要接受乙個額外的(不被使用)int型別的形參。當我們使用後置運算子時,編譯器為這個形參提供乙個值為0的實參。

舉例說明

class  point
為了與內建版本保持一致,後置運算子應該返回物件的原值(遞增或遞減之前的值),返回的形式是乙個值而非引用

對於後置版本來說,在遞增物件之前需要首先記錄物件的狀態:

point point :: operator++(int)

因為我們無需用到int形參,所以勿需為其命名

看完這篇文章,其實運算子過載的事就學的差不多了,關於+ 、 - 、 * 、 / 的運算子過載,其實是差不多的,在這就沒有多家贅述。雖然寫的不是很好,但是強烈建議把本篇文章放進收藏夾吃灰

好吧,還是csdn寫文章更香

關於運算子過載 總結

1 運算子過載是為了對使用者自定義資料型別的資料的操作與內定義的資料型別的資料的操作形式一致。不能過載的5個運算子 成員指標訪問運算子 域運算子 sizeof長度運算子 條件運算子 成員訪問符。運算過載的三種方式 普通函式,友元函式,類成員函式。當過載為成員函式時,雙目運算子僅有乙個引數。對單目運算...

關於運算子過載

之前看 effective c 的時候,對這一部分印象比較深刻,雖然讀的時候有寫筆記,但是現在還是寫下來我對這一部分理解。詳細的內容可以看條款19 分清成員函式,非成員函式和友元。條款19的結論如下 只有在下列情況下,讓函式f成為類c的非成員函式。其餘情況,f都宣告為c的成員函式。1 operato...

關於運算子過載

所謂運算子過載其實就是對於運算子針對不同操作物件而實現不同功能,其實質就是函式過載 函式過載前面有一篇介紹 實現過程就是先把運算表示式轉化為對運算子函式的呼叫,把運算物件轉化為運算函式的實參,然後根據實參的型別確定需要呼叫的函式。另外,c 標準規定了一些不能過載的操作符,分別是 1.類屬關係運算子 ...