C 運算子過載分析

2021-09-01 08:19:26 字數 2113 閱讀 8491

第一先給出搬運資料:

來自 c++_運算子過載 - 思考,思考,再思考- - csdn部落格

過載運算子是一種c++給類的功能一種擴充套件 使類能夠使用運算子操作一樣 實際上 當使用類似a++ 這種運算時自動呼叫了我們自己寫好的過載函式:

#include using namespace std;

class a

void operator ++()

void show()

point(point& p)

const point operator+(const point& p);//使用成員函式過載加號運算子

friend const point operator-(const point& p1,const point& p2);//使用友元函式過載減號運算子

};

const point point::operator+(const point& p)

point const operator-(const point& p1,const point& p2)

以及呼叫方法

point a(1);  

point b(2);

a+b; //正確,呼叫成員函式

a-b; //正確,調用友元函式

a+1; //正確,先呼叫型別轉換函式,把1變成物件,之後呼叫成員函式

a-1; //正確,先呼叫型別轉換函式,把1變成物件,之後調用友元函式

1+a; //錯誤,呼叫成員函式時,第乙個運算元必須是物件,因為第乙個運算元還有呼叫成員函式的功能

1-a; //正確,先型別轉換 後調用友元函式

所以通過例子總結如下:

如果是一元運算子 例如a++ 、!a  、~a、new a、等等 這些運算子的物件只有乙個,即我們定義的物件a ,這些運算子建議使用成員函式。

如果是二元運算子 +- */一般要考慮 運算的物件是什麼 如果類似a1+a2 種 在a本類之間運算可以採用成員函式 如果是有乙個類b 想要運算a+b 如果a,b運算時都需要訪問各自類的私有成員建議使用友元函式 

另外有些運算子必須使用相應的函式

運算子函

必須是成員函式

cout<<   cin>>

必須是友元函式

額外說明:cout << a  要實現這種運算子 需要使用到類似這種函式定義:

friend ostream & operator <<(ostream & out, a & a);

<< 物件左邊是ostream物件 即標準輸入流類 cout即對應out引數  而a為》右邊的物件,

我們可以看如下奇怪的定義和匹配的奇怪的呼叫格式:

呼叫函式引數返回值格式

呼叫格式

型別返回值

函式名引數

ostream & operator <<(a & b);

a《成員

ostream &

operator <<

a & b (this指標)

ostream & operator <<(ostream & out);

a《成員

ostream &

operator <<

ostream & (this指標)

friend ostream & operator <<(a & a,ostream & out);

aostream &

operator <<

a & a,ostream & out

friend ostream & operator <<(ostream & out, a & a);

coutostream &

operator <<

ostream & out,a & a

很明顯,同樣的函式過載:引數不同導致了呼叫格式不同,服務物件也不同 同樣的引數置換了位置(例子3 和4 ) 呼叫也發生了變化。

返回值說明: 返回值代表這個運算的結果 如果說單獨呼叫只需要函式內部運算,不需要結果可以返回void 。

1.運算子的第一操作物件決定是使用成員函式還是友元函式

2.過載的引數順序和型別決定要使用什麼樣的物件和物件間過載

3.返回值代表這個運算子可以提供的運算結果

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

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

C 運算子過載賦值運算子

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

C 運算子過載轉換運算子

為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...