C 運算子過載問題以及涉及的深拷貝與淺拷貝的問題

2021-09-26 15:15:39 字數 3231 閱讀 6613

我們都對於「+」,「-」,「*」,「/」等等運算子(操作符)很熟悉,**中天天敲這些東西。

但是我們知道這些操作符都只能對基本型別進行運算,比如int,double什麼的。

現在我們學習了c++,每天都寫了很多類,物件,但是有一件事情很苦惱,那就是我們想對類物件來實現以前運算子所能實現的功能時就必須寫成員函式或者普通函式來呼叫函式,但是這樣又很麻煩。

在學習了c++中字串類string後,我們發現裡面竟然可以使用以前的運算子,如「+」,「+=」,「>」,「>=」等這些運算子都可以使用,所以我們也想在自己寫的類中也可以使用這些運算子。

這時候我們就要用到運算子過載操作:

運算子過載:

關鍵字:operator

書寫形式:

返回值型別 operator 運算子(參數列)

作用:

運算子過載是對已有的運算子賦予多重含義,使同乙個運算子作用於不同型別的資料時導致不同的行為。

下面舉乙個很簡單的例子:

在乙個複數類中過載「+」和「-」運算子,使其能夠用於類物件的運算中。

#includeusing namespace std;

class complex //複數類定義

complex operator+(const complex& c2)const; //運算子+過載函式

complex operator-(const complex& c2)const; //運算子-過載函式

void display()const; //輸出複數

private: //私有資料成員

double real; //複數實部

double imag; //複數虛部

運算子過載的規則:(1)只能過載已有的運算子,不能創造新的運算子;

(2)「.」 , 「.*」 , 「::」 , 「?::」 這四個運算子不允許過載;

(3)過載運算子時,如果其所有運算元都是內建型別(即所有運算元都是int,double這一類),則不能過載;

(4)「=」 , 「」 , 「()」 , 「->」 只能以成員形式過載;

(5)過載運算子不會改變運算子三大特性(優先順序,結合方向,運算元);

(6)單目運算子:

a.成員函式形式(無參),唯一運算元傳給this;

b.普通函式形式(單參),唯一運算元傳給引數;

雙目運算子:

a.成員函式形式(單參),左運算元傳給this,右運算元傳給引數;

b.普通函式形式(雙參),左運算元傳給第乙個引數,右運算元傳給第二個引數;

*(7)過載運算子應該盡可能保證所作操作與原運算子功能一致或相近。

注:

建立乙個類什麼都不寫時類中會有六個預設函式

(1)建構函式

(2)拷貝建構函式

(3)析構函式

(4)「=」賦值函式

(5)「&」取位址函式

(6)「const 類名 * p=&物件名」 取常位址函式

其中後三個都屬於運算子過載。

下面的例子是我自己寫的string類,其中可以實現「=」 , 「+=」 , 「+」等運算子過載

裡面還涉及了一些深拷貝和淺拷貝的問題:簡單來說:平常預設的拷貝建構函式就屬於淺拷貝,淺拷貝可以解決大部分問題,但是有的時候我們的類中資料成員並不是類所表示的全部屬性,比如字串類中,只有乙個資料成員是乙個指標,它指向的空間才是存放字串的地方,而淺拷貝只是將類中的指標成員複製了乙份,這樣兩個類物件指向的就是同一塊空間,其中乙個變了另乙個也就會變化,當乙個執行析構函式釋放空間時,另乙個再呼叫析構函式的話就會出問題。

如圖:

而深拷貝構造就是在對類中資料成員進行複製時將其所指向的空間也一起複製

如圖:

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

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

C 之 運算子過載問題

記錄 之前先記一下左右值和訪問資料的問題 資料的存放分三個部分,堆區,棧區和靜態變數區 左值可以更改,右值不能更改 棧區和堆區儲存的都是左值,可以隨意更改其值,靜態變數區部分資料是右值,比如const修飾的值,函式建立的臨時變數,都不可更改 字首 過載,直接直接 操作,返回本身即可 字尾 過載,需建...

C 運算子過載賦值運算子

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