運算子過載函式 友元函式 成員函式 普通函式

2021-08-02 05:22:53 字數 1344 閱讀 3867

complex complex::operator+(const complex &c2){}

對於上面的+,之所以知道它為二元運算是因為 由上面的函式形式可知,這是乙個成員函式,

因此隱含地有 operatpr+(complex *this,complex &c2) 。

用complex complex::operator+(complex &c2)定義的是複數+複數;

用complex complex::operator+(double &d)定義的是複數+實數;

而對於complex c4=3.14+c2來說,不管用上面的哪個函式都是不對的,因為這個表示式需要的

是實數+複數:

可以用友元函式實現complex operator+(double &d,complex &c){}

也可以用普通函式

但是不可以用成員函式實現!!!

運算子過載函式可以是類的成員函式:

它可以通過this指標自由訪問本類的資料成員,少寫乙個函式的引數,但是有乙個要求就是運算的第乙個運算量必須是當前類的物件;

運算子過載函式也可以是類的友元函式:

如果運算子左側的運算元屬於c++標準型別(如int)或是乙個其他類的物件,則運算子過載函式不能選用成員函式

為方便訪問類的私有成員,宣告為友元函式為佳

運算子過載函式還可以是普通函式:

但是普通函式一般不能直接訪問類的私有成員

友元的使用會破壞類的封裝,原則上要盡量將運算子函式作為成員函式;

一般單目運算子過載為成員函式,雙目運算子過載為友元函式;

對於數學上交換律成立的運算子,應兩次過載運算子:比如複數+實數;實數+複數

有的運算子必須定義為類的成員函式

如:賦值運算子,下標運算子,函式呼叫運算子

有的運算子則不能定義為類的成員函式

如:流插入<<   流提取》 型別轉換運算子

成員運算子過載函式與友元運算子過載函式的比較

1 對雙目運算子而言,成員運算子過載函式引數表中含有乙個引數,而友元運算子過載函式引數表中含有兩個引數 對單目運算子而言,成員運算子過載函式引數表中沒有引數,而友元運算子過載函式引數表中含有兩個引數。2 雙目運算子一般可以被過載為友元運算子過載函式或成員運算子過載函式,但有一種情況,必須使用友元函式...

C 運算子過載形式 成員函式or友元函式

運算子過載是c 多型的重要實現手段之一。通過運算子過載對運算子功能進行特殊定製,使其支援特定型別物件的運算,執行特定的功能,增強c 的擴充套件功能。運算子過載的我們需要堅持四項基本原則 1 不可臆造運算子 2 運算子原有運算元的個數 優先順序和結合性不能改變 3 運算元中至少乙個是自定義型別 4 保...

C 運算子過載形式 成員函式or友元函式

一般來說,c 運算子過載可採用成員函式和友元函式,二者都可以訪問類的私有成員,那麼該採用哪一種呢?首先看一下二者的區別。如下 class string 因為string的構造函式引數為乙個char 所以如果採用友元形式的friend string operator const string a,co...