在研究類的預設成員函式的時候我們接觸到了運算子過載,其中包括賦值操作符過載 取位址操作符過載 const 修飾的取位址操作符的過載
這一節我們主要來研究一下賦值運算子以及·加加減減的過載
運算子的過載實際上是對運算子函式的過載來實現的
話不多說直接上**來看
#define _crt_secure_no_warnings
#include
using
namespace std;
class
complex
void
display()
; complex operator+(
const complex &c)
;//二元加重載成員函式
complex operator-(
const complex &c)
;//二元減重載成員函式
complex operator-(
);//一元過載成員函式};
void complex::
display()
complex complex::
operator+(
const complex &c)
complex complex::
operator-(
const complex &c)
complex complex::
operator-(
)int
main()
通過這段**我們發現,通過對於運算子的過載可以實現對於類的想要操作,語法通過**也就很明顯的展現出來
函式型別 + operator + 過載的運算子(形參列表)
過載類的成員函式的時候,引數個數 = 原運算元個數 -1(後置++,前置++除外);
當類的物件呼叫這種運算子函式的時候,物件中的成員資料就是乙個運算元,另乙個運算元通過引數傳遞來獲得。
看完這 很多人應該想問為啥引數個數等於原來運算元減1?
this指標不知道你是否還記得?
當運算元為雙目運算子的時候,其中乙個運算資料是物件本身的資料,由this指標給出,另乙個運算元的資料需要傳引數來確定,(當然,特殊情況狂特殊考慮),運算子是單目運算子的時候,運算元直接由this指標給出,就不需要任何函式來傳遞。
類的友元函式的過載
運算子過載為類的友元函式時,所需要的運算元必須通過函式形參來傳遞。
上面我們剛提到了this指標,在學習友元的時候我們說友元函式沒有this指標,所以引數傳遞就只有是形參來傳遞了。
也分為兩種情況:
當運算子為雙目運算子時,以加號為例 a+b 實際上就是 operator+(a,b);
當運算子為單目運算子的時候 比如後置減減,實際上就是呼叫函式operator–(a);
具體怎麼樣直接上**看實際情況中的操作
class
complex
void
display()
;friend complex operator-(
const complex &c1,
const complex &c2)
;//二元過載減友元函式
friend complex operator-(
const complex &c)
;//一元過載減友元函式
friend complex operator+(
const complex &c1,
const complex &c2)
;//二元過載加友元函式};
void complex::
display()
complex operator-(
const complex &c1,
const complex &c2)
complex operator-(
const complex &c)
complex operator+(
const complex &c1,
const complex &c2)
intmain()
我們可以發現,在友元函式過載的過程中,函式引數 = 原來運算元的個數,至少有乙個自定義型別的形式引數,在呼叫這種運算子函式的時候,所有的運算元都要通過引數傳遞來獲得。
友元函式不能過載的運算子
= ()-> 。
接下來就是我們學習c++過程中經常需要實現的多種運算子的過載:
一·. ++和–的過載
主要還是強調一下後置++ --的過載操作,前置操作在前面實現複數運算的時候已經實現,主要是後置時候的操作,我們需要增加乙個int型別的引數,在呼叫時,引數int並不參與運算,只是用來區分過載函式。
話不多說,直接上**:
class
test
;test::
test
(int num1,
int num2)
test test::
operator++(
)test test::
operator--(
)void test::
display()
test test::
operator++(
int)
test test::
operator--(
int)
再來看常用的 = 的過載
有乙個引用引數,為了防止對賦值號右邊進行拷貝,從而提高函式執行時效率,
函式返回了引用而不是物件,這樣,賦值建構函式不如使用引用引數和返回引用更加有效。
例如:
class
string
~string()
void
print()
string &
operator
=( string & s)
;//函式返回引用更為有效};
string &string::
operator
=(string &s )
else
}int
main()
這樣就完成了賦值運算子的過載,其實根據類私有成員的不同,過載的方式是不同的,具體還要看怎麼實現,掌握語法和原理很重要,在接下來的學習中一起看啊。 運算子過載之過載型別運算子
普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...
運算子過載 賦值運算子的過載
有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...
運算子過載
c 中的運算子 1。大多數系統預定義運算子都能過載 不值得過載 不能被過載 2過載不能改變優先順序 不能改變結合性 不能改變運算子所需運算元的個數 過載後,可按這些運算子的表達方式使用 運算子過載的語法 一 通過運算子過載函式進行過載 1。運算子過載函式是成員函式 語法形式 type x opera...