C 學習 運算子過載

2021-07-30 12:50:37 字數 2204 閱讀 2600

同函式過載一樣,算數操作符過載能夠帶給我們操作不同資料型別的方法,包括你自己定義的類。

我們日常最常用的就是加、減、乘、除,而它們的性質又有些相似。所以,它們的運算子實現方式也有些相似。

共有三種實現方式:

首先,我們介紹怎樣使用友鄰函式定義操作符過載。看下面的**:

#include 

class cents

// 使用友鄰函式實現 cents + cents

friend cents operator+(const cents &c1, const cents &c2);

// 使用友鄰函式實現 cents - cents

friend cents operator-(const cents &c1, const cents &c2);

int getcents(void) const

};// 注意: 這個函式不是成員函式!

cents operator+(const cents &c1, const cents &c2)

// 注意: 這個函式不是成員函式!

// 實現方式與加法相同

cents operator-(const cents &c1, const cents &c2)

int main()

#include 

class cents

int getcents() const

};// 注意:該函式既不是成員函式,也不是友鄰函式!

cents operator+(const cents &c1, const cents &c2)

int main()

使用成員函式實現操作符與友鄰函式的實現方式非常相似。要滿足下面三個條件:

(1)過載操作符必須被新增為乙個成員函式的左運算元;

(2)左運算元成為隱含的this指標指向的物件;

(3)所有其它的運算元都是函式引數;

看下面的**:

#include 

class cents

// overload cents + int

cents operator+(int

value);

int getcents()

};// 注意:該函式是乙個成員函式!

// 因為this指標,所以友鄰函式所有引用都可以去掉

cents cents::operator+(int

value)

int main()

6.1 普通函式方式和友鄰函式方式

通常情況下,如果有可能使用的已存在的成員函式,就優先使用普通函式實現(接觸你的類內部的函式越少越好)。但是,不要為了替代友鄰函式而新增額外的函式去實現普通函式過載操作符。

6.2 友鄰函式和成員函式的比較

在編寫**的時候,我們該怎麼選擇呢?

首先,並不是所有的操作符都可以使用友鄰函式過載

賦值 (=),下標(),函式呼叫(()),成員選擇(->)操作符必須被過載為成員函式,因為c++語言就是這樣規定的。

其次,所有的操作符也都不可以被過載為成員函式

看下面的**:

#include 

class point

friend std::ostream& operator

<< (std::ostream &out, const point &point);

};std::ostream& operator

<< (std::ostream &out, const point &point)

在上面的**中,operator《不能被過載為成員函式。為什麼呢?因為過載的操作符必須是成員的左運算元。在該例中,左運算元是物件的型別std::ostream。std::ostream是標準庫的一部分。所以,我們不能修改類宣告,將std::ostream新增為過載操作符。

所以,只能用友鄰函式實現《過載。

相似的,儘管我們能夠過載 operator+(cents, int) 為成員函式,正如我們上面做的,但是我們不能將其過載為成員函式,因為int不是我們能夠新增成員的類。

通常,如果左操作符既不是類(如int),也不是我們能修改的類(如:std::ostream),我們不能使用成員過載。

總結如下:

c 學習運算子過載

運算子過載 1 實驗目的 學習掌握重定義與類有關的運算子。把握過載運算子的時機。學習掌握把乙個類物件轉換為另乙個類物件。學習掌握過載為成員與友元的區別及其帶引數的情況。學習掌握值返回與引用返回的區別及應用時機。2 實驗內容 1 生成乙個表示複數的類fs。複數的實部sb和虛部xb作為其資料成員。提供成...

C 學習 運算子過載

運算子過載的本質 過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。大多數的過載運算子可被定義為普通的非成員函式或者被定義為類成員函式。非成員函式 需要為每次操作傳遞兩個引數 box oper...

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

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