c中怎麼過載後置自加運算子,C中如何自定義過載運算子

2021-05-15 14:20:51 字數 5088 閱讀 6903

1樓:匿名使用者

字尾不是簡單的過載,需要在形參處加個型別符號,然後在函式體內使用區域性變數

保版存變數自增之前權的資料,然後++變數,返回區域性變數就行了,注意返回狀態不能為引用,因為返回的是區域性變數,引用它會導致未定義行為。

2樓:龍2劍雨

public:

num operator ++(int)

c++中如何自定義過載運算子

3樓:匿名使用者

c++中預定義的運

算符其運算物件只能是基本資料型別,而不適用於使用者自定義型別(如類).

// 同上,內建的運算子 只能應用於內建的資料型別 ...比如 int char double .等等。

(一) c++不允許使用者自己定義新的運算子,只能對已有的c++運算子進行過載。

// 就是說只能過載內建的 + - * / 等運算子,不能自己創造運算子計算。 。

(二) c++允許過載的運算子c++中絕大部分的運算子允許過載.

不能過載的運算子只有5個:

(1) 成員訪問運算子.

(2) 作用域運算子∷

(3) 條件運算子?:

(4) 成員指標運算子*

(5) 編譯預處理命令的開始符號#

(三) 過載不能改變運算子運算物件(即運算元)的個數。

// 不能改變運算子運算物件, 比如+法運算子,那麼它有兩個運算元 ..當我們過載它的時候 也只能有兩個運算元 。

(四) 過載不能改變運算子的優先順序別。

// 過載完之後並不能改變它的優先順序別,比如 +號, 無論你怎麼設計過載函式. 它永遠不可能比()的優先順序高......

(五) 過載運算子的函式不能有預設的引數,否則就改變了運算子引數的個數,與前面第(3)點矛盾。

// 於上面3..同。

(六) 過載的運算子必須和使用者定義的自定義型別的物件一起使用,其引數至少應有一個是類物件(或類物件的引用)。也就是說,引數不能全部是c++的標準型別,以防止使用者修改用於標準型別資料的運算子的性質。

// 過載的引數不能全部是c++內建資料型別。 至少要有一個是自定義型別。因為如果我們定義的是兩個內建的型別 就會跟系統所定義的衝突。

因為當我們使用內建的運算子時,那麼編譯器其實也是呼叫的一個過載運算子進行計算。這是編譯器自動新增的。 如果我們也定義的相同 那麼肯定會產生衝突。

(七) 用於類物件的運算子一般必須過載,但有兩個例外,運算子「=」和「&」不必使用者過載。

1 賦值運算子(=)可以用於每一個類物件,可以利用它在同類物件之間相互賦值。

2 地址運算子&也不必過載,它能返回類物件在記憶體中的起始地址。

// 前面已經說過,c++內建運算子只能計算內建的資料型別 。所以當我們要使用自定義型別時 就必須要進行過載..

總之,當c++語言原有的一個運算子被過載之後,它原先所具有的語義並沒有消失,只相當於針對一個特定的類定義了一個新的運算子。

運算子過載可以使用成員函式和友元函式兩種形式。可以參考以下的經驗:

(1)只能使用成員函式過載的運算子有:=、()、、->、new、delete。

(2)單目運算子最好過載為成員函式。

(3) 對於複合的賦值運算子如+=、-=、*=、/=、&=、!=、~=、%=、>>=、<<=建議過載為成員函式。

(4) 對於其它運算子,建議過載為友元函式。

運算子過載的方法是定義一個過載運算子的函式,在需要執行被過載的運算子時,系統就自動呼叫該函式,以實現相應的運算。也就是說,運算子過載是通過定義函式實現的。運算子過載實質上是函式的過載。

過載運算子的函式一般格式如下:

函式型別 operator 運算子名稱 (形參表列)

過載為類成員函式時引數個數=原運算元個數-1

(後置++、--除外)

// 當過載為類成員函式時,引數個數等於原來的運算元-1 ..比如 物件a +物件b ..我們過載的時候需要兩個運算元 a 和b 但我們傳遞過去一個就可以了 , 比如 a+b 我們只需要把b傳遞過去就可以了。

因為當呼叫過載運算子時 就是a呼叫的過載運算子,那麼它就是當前物件 它就是這時的this 指標 ..而且類成員函式只能使用兩個類中成員...

過載為友元函式時 引數個數=原運算元個數,且至少應該有一個自定義型別的形參。

//與上面沒多大區別,但它卻可以呼叫非類中物件.. 比如呼叫一個物件a+1 ..注意的是即使定義為友元函式,它的運算元也必須有一個為自定義型別。

看一個例項:

#include

using namespace std;

class ***plex //複數類宣告

//建構函式

***plex operator + (***plex c2); //+過載為成員函式

***plex operator - (***plex c2); //-過載為成員函式

void display(); //輸出顯示覆數

private: //私有資料成員

double real; //複數實部

double imag; //複數虛部

};***plex ***plex::operator +(***plex c2) //過載函式實現

***plex ***plex::operator -(***plex c2) //過載函式實現

void ***plex::display()

這段** 修改一下... 改為 ***plex friend ***plex::operator +(***plex c2 ***plex c3)

那麼同樣也可以完成相同的功能..而且還更容易擴充..因為從上面得知..

過載的運算子必須和使用者定義的自定義型別的物件一起使用. 也就是說至少有一個自定義型別..或者是它的引用..

如果我們使用成員運算子過載的話只能使用類中的物件成員..而使用友元運算子過載那麼我們則可以使用類外的資料..當我們需要使用的時候直接修改為 ***plex friend ***plex::

operator +(***plex c2 int a) 如這樣的形式就可以了。

4樓:匿名使用者

[c++]過載運算子 收藏

所謂過載,就是重新賦予新的含義。函式過載就是對一個已有的函式賦予新的含義,使之實現新功能。

運算子也可以過載

運算子過載是對已有的運算子賦予多重含義

必要性c++中預定義的運算子其運算物件只能是基本資料型別,而不適用於使用者自定義型別(如類)

(一) c++不允許使用者自己定義新的運算子,只能對已有的c++運算子進行過載。

(二) c++允許過載的運算子c++中絕大部分的運算子允許過載.

不能過載的運算子只有5個:

(1) 成員訪問運算子.

(2) 作用域運算子∷

(3) 條件運算子?:

(4) 成員指標運算子*

(5) 編譯預處理命令的開始符號#

(三) 過載不能改變運算子運算物件(即運算元)的個數。

(四) 過載不能改變運算子的優先順序別。

(五) 過載運算子的函式不能有預設的引數,否則就改變了運算子引數的個數,與前面第(3)點矛盾。

(六) 過載的運算子必須和使用者定義的自定義型別的物件一起使用,其引數至少應有一個是類物件(或類物件的引用)。也就是說,引數不能全部是c++的標準型別,以防止使用者修改用於標準型別資料的運算子的性質。

(七) 用於類物件的運算子一般必須過載,但有兩個例外,運算子「=」和「&」不必使用者過載。

1 賦值運算子(=)可以用於每一個類物件,可以利用它在同類物件之間相互賦值。

2 地址運算子&也不必過載,它能返回類物件在記憶體中的起始地址。

總之,當c++語言原有的一個運算子被過載之後,它原先所具有的語義並沒有消失,只相當於針對一個特定的類定義了一個新的運算子。

運算子過載可以使用成員函式和友元函式兩種形式。可以參考以下的經驗:

(1)只能使用成員函式過載的運算子有:=、()、、->、new、delete。

(2)單目運算子最好過載為成員函式。

(3) 對於複合的賦值運算子如+=、-=、*=、/=、&=、!=、~=、%=、>>=、<<=建議過載為成員函式。

(4) 對於其它運算子,建議過載為友元函式。

運算子過載的方法是定義一個過載運算子的函式,在需要執行被過載的運算子時,系統就自動呼叫該函式,以實現相應的運算。也就是說,運算子過載是通過定義函式實現的。運算子過載實質上是函式的過載。

過載運算子的函式一般格式如下:

函式型別 operator 運算子名稱 (形參表列)

過載為類成員函式時引數個數=原運算元個數-1

(後置++、--除外)

過載為友元函式時 引數個數=原運算元個數,且至少應該有一個自定義型別的形參。

將「+」、「-」運算過載為複數類的成員函式。

規則:實部和虛部分別相加減。

運算元:

兩個運算元都是複數類的物件。

#include

using namespace std;

class ***plex //複數類宣告

//建構函式

***plex operator + (***plex c2); //+過載為成員函式

***plex operator - (***plex c2); //-過載為成員函式

void display(); //輸出顯示覆數

private: //私有資料成員

double real; //複數實部

double imag; //複數虛部

}; ***plex ***plex::operator +(***plex c2) //過載函式實現

***plex ***plex::operator -(***plex c2) //過載函式實現

void ***plex::display()

{ cout<<"("real就是c1.real。

在將運算子函式過載為成員函式後,如果出現含該運算子的表示式,如c1+c2,編譯系統把它解釋為c1.operator+(c2)

即通過物件c1呼叫運算子過載函式,並以表示式中第二個引數(運算子右側的類物件c2)作為函式實參。運算子過載函式的返回值是***plex型別,返回值是複數c1和c2之和(***plex(c1.real + c2.

real,c1.imag+c2.imag))。

C運算子過載是什麼意思C中運算子過載到底有什麼何意義?

所謂過載,就是重新賦予新的含義。函式過載就是對一個已有的函式賦予新的含義,使之實現新功能,因此,一個函式名就可以用來代表不同功能的函式,也就是 一名多用 運算子也可以過載。實際上,我們已經在不知不覺之中使用了運算子過載。例如,大 家都 已習慣於用加法運算子 對整數 單精度數和雙精度數進行加法運算,如...

C指標運算子過載

比如這麼定義 template class linkedlist node operator int 前置,返回next節點 inline node getfirstnode 連結串列為空會出錯 private node pfirst 不過以上 有個很大的問題,實際上是不能用的,只是為了說明一下。因...

C中,如果使用運算子過載,比如過載,如問題補充裡

你過載的是用於 plex類的 copy 運算子,在 裡面的r b.r可以看作r.b.r 就是物件r所屬的類過載的 平時我們對於兩個整型的數的加法運算,比如兩個整型數int a和int b,a b就是呼叫了類似成員函式的經過過載的方法 也就相當於a.b 你要使用這個過載的運算子,譬如對於兩個 plex...