運算子過載 過載實現複數 string類

2021-10-04 11:07:26 字數 4335 閱讀 7744

3、運算子過載實現string類

引言:在模板中,我們定義了如下的sum函式

template

<

typename t>

t sum

(t a,t b)

如果是正常的資料型別還可以運算,但是遇到物件相加了怎麼辦呢?

那麼就引出我們今天所要討論的內容——運算子過載

1、運算子過載的作用

就像我們引言中所描述的一樣,運算子過載的作用就是使得自定義型別和內建型別相同的邏輯

2、執行機制

主要是通過函式實現的。

【舉個栗子】

int main()

; int len = sizeof(arr) / sizeof(arr[0]);

for (cint i = 0; i < len; i++)

std::cout << std::endl;

return 0;

}

在上面的這個程式邏輯裡面,cin是乙個物件,需要我們實現比較運算子的過載、++運算子的過載、中括號運算子過載等。

1、比較運算子的過載

因為運算子過載是通過函式實現的,所以在設計的時候我們就需要考慮函式的函式名、引數、返回值、函式體這四個元素。

bool

operator

<

(int rhs)

2、++運算子的過載

分析

因為++運算子的過載還分為前置加加和後置加加。所以為了區分,我們使用乙個標誌,將引數是int的設定成為後置加加,沒有引數的表示前置加加。

然後再來分析常量中後置加加的邏輯,他是乙個先賦值後加加的過程。所以對應到物件裡面,我們就應該首先拿到臨時量的備份,再加加。

實現如下:

const cint operator++(

int)

前置加加就是先加加再賦值的過程,所以返回的是自加變數的本身,實現如下:

const cint operator++(

)

3、中括號運算子

分析

這是是乙個雙目運算子,arr[i]和i[arr]表示的含義都是一樣的,左運算元接收的是乙個物件,右運算元接收形參int型的指標為第乙個元素的位址。返回的是記憶體單元的本身,就是int&

實現如下

int

&operator

(int

* parr)

2、總結

函式的實現分為兩種方式

在類中:this指標接收左運算元

在類外:左右運算元通過形參接收(並且一定要記住在類外實現的函式一定要在類中設定成函式友元才能訪問私有的成員變數)

總體實現實現乙個簡單的運算子過載

首先,我們先來編寫乙個簡單的複數運算,**如下:

class ccomplex

void show()

private:

int mreal;

int mimage;

int main()

上述**優化後的結果如下:

ccomplex operator+(

const ccomplex& src)

//引用接收另乙個複數類物件

2、物件+變數

分析

加號運算子的邏輯功能,加號邏輯完成過後,左右運算元的值是不會改變的,是存放在乙個臨時量裡面的。相應的,在類中就應該返回的是常臨時物件。類型別的返回是有臨時物件的生成,所以不用再加引用

實現

const ccomplex operator+(

int rhs)

3、變數+物件

分析

不能放在類中處理,因為類中this指標接收的是左運算元是乙個物件。如果寫在類外的話就是乙個_cdcal呼叫約定,沒有this指標。就寫兩個引數即可,另外還要注意在類中還有乙個與其對應的友元函式。返回值就是臨時物件的常量

**實現

const ccomplex operator+(

int lhs,

const ccomplex& rhs)

1、輸出流運算子

分析

當我們要輸出物件的資訊時,就必須過載輸入輸出運算子。該運算子是在類外定義的,所以要在私有成員變數裡面定義友元函式。

std::ostream&

operator

<<

(std::ostream& out,

const ccomplex& src)

2、輸入流運算子

分析

因為輸入一定會改變物件的值,和輸出流運算子不同的是右運算元複數類物件不能使用const

**實現

std::istream&

operator

>>

(std::istream& in,ccomplex& src)

1、比較運算子過載函式(==)

bool

operator==(

const ccomplex& src)

2、比較運算子過載函式(>)

bool

operator

>

(const ccomplex& src)

總體**參考實現乙個複數類

首先,我們先來編寫乙個簡單的字串運算,**如下:

int main()

if (str3 != str4)

return 0;

}

1、物件+字串的過載函式

在類中實現

const string operator+(

const

char

* rhs)

2、物件+物件的過載函式

在類中實現

const string operator+(

const string& rhs)

3、字串+物件的過載函式

在類外實現,傳入兩個引數

const string operator+(

const

char

* lhs,

const string& rhs)

字串之間的比較主要是使用strcmp系統函式實現。

bool

operator

>

(const string& str)

bool

operator

<

(const string& str)

bool

operator==(

const string& str)

//輸出運算子過載

std::ostream&

operator

<<

(std::ostream& out,

const string rhs)

//輸入運算子過載

std::ostream&

operator

>>

(std::ostream& in, string rhs)

整體**參考運算子過載實現string類

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

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

運算子過載 複數類

1.普通運算子可以過載 2.型別過載1 防止實參被修改 2 接收隱式生成臨時物件 類內是this call的呼叫約定,成員方法隱藏this指標,指向一般為左運算元,所以只用傳右運算元即可 如下 class ccomplex 構造類內實現 的過載 右運算元型別為intconst ccomplex op...

複數類運算子過載

includeusing namespace std class complex complex operator complex co 過載 號,實現複數相加 complex operator complex co 過載 號,實現複數相減 complex operator complex co 過...