所謂過載,就是賦予新的含義。
函式過載(function overloading)可以讓乙個函式名有多種功能,在不同情況下進行不同的操作。運算子過載(operator overloading)也是乙個道理,同乙個運算子可以有不同的功能。
實際上,我們已經在不知不覺中使用了運算子過載。例如,+
號可以對不同型別(int、float 等)的資料進行加法操作;<<
既是位移運算子,又可以配合 cout 向控制台輸出資料。c++ 本身已經對這些運算子進行了過載。
c++ 也允許程式設計師自己過載運算子,這給我們帶來了很大的便利。
下面的**定義了乙個複數類,通過運算子過載,可以用+
號實現複數的加法運算:
#include
using
namespace std;
class
complex
;complex::
complex
():m_real
(0.0
),m_imag
(0.0
)complex::
complex
(double real,
double imag):
m_real
(real),
m_imag
(imag)
//實現運算子過載
complex
complex::
operator
+(const
complex
&a)const
void complex::
display
()const
intmain
()
執行結果:
6.7 + 9.5i
本例中義了乙個複數類 complex,m_real 表示實部,m_imag 表示虛部,第 10 行宣告了運算子過載,第 21 行進行了實現(定義)。認真觀察這兩行**,可以發現運算子過載的形式與函式非常類似。
運算子過載其實就是定義乙個函式,在函式體內實現想要的功能,當用到該運算子時,編譯器會自動呼叫這個函式。
也就是說,運算子過載是通過函式實現的,它本質上是函式過載。
運算子過載的格式為:
返回值型別 operator 運算子名稱 (形參表列)
operator
是關鍵字,專門用於定義過載運算子的函式。我們可以將operator 運算子名稱
這一部分看做函式名,對於上面的**,函式名就是operator+
。
運算子過載函式除了函式名有特定的格式,其它地方和普通函式並沒有區別。
上面的例子中,我們在 complex 類中過載了運算子+
,該過載只對 complex 物件有效。當執行c3 = c1 + c2;
語句時,編譯器檢測到+
號左邊(+
號具有左結合性,所以先檢測左邊)是乙個 complex 物件,就會呼叫成員函式operator+()
,也就是轉換為下面的形式:
c3 = c1.operator+(c2);
c1 是要呼叫函式的物件,c2 是函式的實參。
上面的運算子過載還可以有更加簡練的定義形式:
complex
complex::
operator
+(const
complex
&a)const
return 語句中的complex(this->m_real + a.m_real, this->m_imag + a.m_imag)
會建立乙個臨時物件,這個物件沒有名稱,是乙個匿名物件。在建立臨時物件過程中呼叫建構函式,return 語句將該臨時物件作為函式返回值。運算子過載函式不僅可以作為類的成員函式,還可以作為全域性函式。
更改上面的**,在全域性範圍內過載+
,實現複數的加法運算:
#include
using
namespace std;
class
complex
;complex
operator
+(const
complex
&a,const
complex
&b);
complex::
complex
():m_real
(0.0
),m_imag
(0.0
)complex::
complex
(double real,
double imag):
m_real
(real),
m_imag
(imag)
void complex::
display
()const
//在全域性範圍內過載+
complex
operator
+(const
complex
&a,const
complex
&b)int
main
()
運算子過載函式不是 complex 類的成員函式,但是卻用到了 complex 類的 private 成員變數,所以必須在 complex 類中將該函式宣告為友元函式。
當執行c3 = c1 + c2;
語句時,編譯器檢測到+
號兩邊都是 complex 物件,就會轉換為類似下面的函式呼叫:
c3 = operator+(c1, c2);
雖然運算子過載所實現的功能完全可以用函式替代,但運算子過載使得程式的書寫更加人性化,易於閱讀。運算子被過載後,原有的功能仍然保留,沒有喪失或改變。通過運算子過載,擴大了c++已有運算子的功能,使之能用於物件。
C 運算子過載的概念和語法
c 允許在同一作用域中的某個函式和運算子指定多個定義,分別稱為函式過載和運算子過載。過載宣告是指乙個與之前已經在該作用域內宣告過的函式或方法具有相同名稱的宣告,但是它們的引數列表和定義 實現 不相同。當您呼叫乙個過載函式或過載運算子時,編譯器通過把您所使用的引數型別與定義中的引數型別進行比較,決定選...
C 中的運算子過載(一) 運算子過載的概念
概述 運算子過載,就是對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別。運算子過載 operator overloading 只是一種 語法上的方便 也就是它只是另一種函式呼叫的方式,只是為了方便我們使用,運算子只能運算內建的資料型別,對於自定義的資料型別不能運算,所以我們可以過載...
C 過載 和 運算子
流提取運算子 和流插入運算子 注意,我們到目前為止,必須呼叫tostring 函式返回乙個表示rational物件的字串,再把它顯示出來。例如,為了顯示rational 物件r,要編寫一下 形式1 cout r.tostring 而不能直接使用 形式2cout r 但我們平時見到的int doubl...