C運算子過載裡面或者 這樣的只需要運算元的操作怎麼過載

2022-08-17 01:09:23 字數 6606 閱讀 4854

1樓:偶爾e網事

你看一下這個例項就明白了

class point

point operator++();//成員函式定義自增

const point operator++(int x); //字尾可以返回一個const型別的值

friend point operator--(point& p);//友元函式定義--

friend const point operator--(point& p,int x);//字尾可以返回一個const型別的值

};point point::operator++()//++obj

const point point::operator++(int x)//obj++

point operator--(point& p)//--obj

const point operator--(point& p,int x)//obj--

2樓:匿名使用者

《型別》 operator++(); //前置自增《型別》 operator++(int); //後置自增《型別》 operator--(); //前置自減《型別》 operator--(int); //後置自減

3樓:

後置++或者--可以過載為友元函式

c++中,如果使用運算子過載,比如過載+,如問題補充,{}裡的+是什麼用,也會呼叫本身麼

4樓:

你過載的是用於complex類的

copy+運算子,在{}裡面的r+b.r可以看作r.+(b.

r),就是物件r所屬的類過載的+,平時我們對於兩個整型的數的加法運算,比如兩個整型數int a和int b,a+b就是呼叫了類似成員函式的經過過載的方法+,也就相當於a.+(b)。你要使用這個過載的運算子,譬如對於兩個complex物件c1,c2,那麼c1+c2就相當於c1.

+(c2),這裡就使用了你過載的運算子。

c++問題:「通過運算子過載可以改變運算子原有的運算元型別」不懂。它到底怎祥改變的啊?

5樓:匿名使用者

運算子的運算本來只適於基本資料型別的操作.如int,float,char等.可以進行加減乘除等運算.

但是通過運算子的過載你可以進行對任何型別的操作,可以對自己定義的類進行運算.就是說擴充套件了運算元型別.假設你自己定義了一個cstring類,並且過載了"+"運算子,讓兩個字串進行連線操作,即cstring s1="abc";cstring s2="efg";cstring s3=s1+s2;//執行完s3="abcefg",實現了兩個物件之間的操作.

如果你沒有過載"+"運算子,那麼執行s3=s1+s2;編譯器就不知道要執行什麼功能了,就會報錯.

6樓:匿名使用者

就比如說「+」號,當1+1的時候=2,但是當一個學生+一個學生的時候=?,

你可以過載「+」,自己定義「+」,讓他進行你自己規定的運算,一個學生+一個學生=一盤鍋包肉。嘿嘿。

就是類似的道理,希望能對你有幫助。

7樓:匿名使用者

比如+ 比方說以前只能做 1+1 1.2+3.4等等過載了可疑做複數運算 (1+2e)+(2-e)得到(1+2)+(2-1)e=3+e過載運算子就是使原來的運算子有更豐富的功能

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

8樓:匿名使用者

c++中預定義的運

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

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

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

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

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

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

(1) 成員訪問運算子.

(2) 作用域運算子∷

(3) 條件運算子?:

(4) 成員指標運算子*

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

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

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

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

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

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

// 於上面3..同。

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

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

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

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

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

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

// 前面已經說過,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 complex //複數類宣告

//建構函式

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

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

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

private: //私有資料成員

double real; //複數實部

double imag; //複數虛部

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

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

void complex::display()

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

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

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

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

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

9樓:匿名使用者

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

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

運算子也可以過載

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

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

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

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

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

(1) 成員訪問運算子.

(2) 作用域運算子∷

(3) 條件運算子?:

(4) 成員指標運算子*

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(後置++、--除外)

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

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

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

運算元:

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

#include

using namespace std;

class complex //複數類宣告

//建構函式

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

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

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

private: //私有資料成員

double real; //複數實部

double imag; //複數虛部

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

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

void complex::display()

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

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

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

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

c 運算子過載,c 運算子過載

其實第一個回答的程式已經ok了,這裡簡要說明一下 首先,名稱空間的問題。cout endl以及ostream都是定義在std這個名稱空間下的,因此在使用前必須包含這個一個using指示 using namespace std 表明可以使用std裡面的所有內容。除此以外還有兩種選擇 1.使用作用域運算...

C 運算子過載

其實很簡單,只要你對類的建構函式和解構函式了解的差不多。首先說第一個問題 為什麼會突然出現 string t p 在函式 string operator const char p 中,它接受一個字元指標p,返回一個string類物件,這個你懂吧?這就好辦了,這個函式想返回一個string類物件,必須...

C運算子過載

我想樓主主要是想看到過載函式的實現過程,所以我自動給參加運算的複數付值。考慮你是初學者,我都用的是很簡單的語句寫的,都是一看就懂的句子。include using namespace std class complex private double m image 描述實部 double m rea...